我剛開始使用學習Ionic 2來創建個人使用的應用程序(我非常喜歡新手)。在爲自定義隨機生成器創建應用程序時,我碰到了一個小問題(但令人討厭)。Ionic 2,Storage,「keys()」不能正確更新?
該設置是一個主要的「隨機生成器」頁面,每個單獨的「隨機生成器」的離子列表。隨機生成器被存儲爲一個鍵,值(NameOfGenerator,dataInJSON)對,在ionics建議的「存儲」模塊中。所以我的想法是通過存儲中的「keys()」函數獲取離子列表的名稱。這是通過每次添加或刪除生成器時重新運行「keys()」命令來更新的。它適用於刪除,但不會自動更新添加。
我已經看了一下控制檯輸出,它看起來像更新函數(updateGenLst())運行,但「keys()」函數似乎沒有找到新添加的鍵/值對。但是當我重新進入頁面時,「keys()」函數似乎通過構造函數找到它。
我做了以下內容:
- 我進入「隨機生成」頁面,通過主頁
- 我加上「實驗3」作爲一個新的發電機。
- 我回到主頁,然後進入「隨機生成」頁面再次
- 我從列表中
這給了這個控制檯輸出去掉「測試3」:
1. Found in storage Array [ "Test 1", "Test 2" ] main.js:35706:13
2. Hello AddGenPage Page main.js:96550:9
WARN Will-change memory consumption is too high. Budget limit is the document surface area multiplied by 3 (474002 px). Occurrences of will-change over the budget will be ignored. localhost:8100
2. Updateded storage Array [ "Test 1", "Test 2" ] main.js:35720:13
WARN Use of getPreventDefault() is deprecated. Use defaultPrevented instead. localhost:8100
3. Found in storage Array [ "Test 1", "Test 2", "Test 3" ] main.js:35706:13
4. Removed undefined main.js:35725:13
4. Updateded storage Array [ "Test 1", "Test 2" ]
下面我展示了頁面中相關代碼snipps的javascript和html端。
這是我page.ts文件的相關部分:
export class RandomGenerators {
public generators = [];
constructor(public navCtrl: NavController, public modalCtrl: ModalController, public storage: Storage) {
storage.keys().then((val) => {
this.generators = val;
})
}
ionViewDidLoad() {}
updateGenLst() {
this.storage.keys().then((val) => {
this.generators = val;
console.log('Updateded storage', val)
})
}
rmGen(gen){
this.storage.remove(gen).then((val) => {
console.log('Removed ' + val + "");
});
this.updateGenLst();
}
addGen() {
let addModal = this.modalCtrl.create(AddGenPage);
addModal.onDidDismiss((gen) => {
if(gen) {
this.saveGen(gen);
this.updateGenLst();
}
});
addModal.present();
}
saveGen(gen){
this.storage.set(gen.name,gen);
}
下面是HTML端相關部分:
....
<ion-buttons end>
<button ion-button icon-only (click)="addGen()">
<ion-icon name="add-circle"></ion-icon>
</button>
</ion-buttons>
....
<ion-list>
<ion-item-sliding *ngFor="let gen of generators">
<ion-item>
{{gen}}
</ion-item>
<ion-item-options>
<button danger (click)="rmGen(gen)"><ion-icon name="trash"></ion-icon> Delete</button>
</ion-item-options>
</ion-item-sliding>
</ion-list>
好吧,我得到它的工作。我只想檢查我的推理是否正確。因爲updateGenLst()需要storage.set()來「finnished」,所以我需要專門編寫代碼,「在運行stoage.set()之前,不要運行updateGenLst()。要做到這一點的方法是使用然後我可以在任何函數之後使用,甚至是我自己編寫的函數嗎?例如,我可以編寫updateGenLst()。then()嗎?或者我需要重寫updateGenLst(),使其具有「then()」函數所有權? – NewPerspective5
好的..也許你需要從這裏開始.. https://developers.google.com/web/fundamentals/getting-started/primers/promises和https://developer.mozilla。org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise ..存儲spi返回響應的承諾。將在未來的時間收到實際響應(異步編程)。創造一個新的承諾,任何使用'新的承諾(決心,拒絕)'或價值:'Promise.of(val)' –
希望這可以解釋它 –