我有一个 Ionic 2 应用程序,它以列表的形式向用户显示包中的项目。我创建了一个函数,用于检索包内的当前 Item 索引,当用户启动应用程序时触发它。它检查离子存储(内部(内存中的索引名称-值对是否为空。在这种情况下,索引设置为 0 并存储在内部和工作存储器中。否则,索引将从内部存储器中检索并用于设置工作存储器。
但是,下面的代码中的self.storage.set(myString, '0');
抛出错误TypeError: Cannot call method 'set' of undefined
。我使用console.dir
进行了检查,确实self.storage
在then(...);
块内未定义。为什么会这样,我该如何解决它?
导入、声明、构造函数
import { Injectable } from '@angular/core';
import { Storage } from '@ionic/storage';
declare var self: ItemStorageService;
@Injectable()
export class ItemStorageService {
workingMemoryItems: Array<any>;
workingMemoryIndex: number;
packageIndex: number;
constructor(public storage: Storage) {
self = this;
self.packageIndex = 0;
self.initializeIndex().then(
res => {
console.log(res);
},
err => {
console.log(err);
}
)
}
// Other methods including initializeIndex()
}
初始化索引函数
public initializeIndex(): Promise<any> {
console.dir(self.storage); // Returns Storage object
var myString = 'index_item_package_' + self.packageIndex;
return new Promise((resolve, reject) => {
self.storage.get(myString).then(
val => {
if ((val === null) || (val === 'null')) {
console.dir(self.storage); // Returns undefined
self.storage.set(myString, '0');
self.workingMemoryIndex = 0;
resolve('Working memory index not found and set to 0');
} else {
self.workingMemoryIndex = val as number;
resolve('Working memory index found and set to ' + val);
}
},
err => {
self.storage.set(myString, 0);
self.workingMemoryIndex = 0;
reject('Working memory index not found and set to 0');
}
)
});
}
我相信发生这种情况的原因是因为全局变量self
在我的每个页面和服务的顶部都声明了。这意味着当我运行self.storage.get(myString)
时,ItemStorageService
的构造函数正在运行并重新初始化self
以指向自身。
解决方案不是在任何地方都使用self
,而只在需要的地方(如回调函数内部(,并确保self = this
设置尽可能靠近使用位置的位置。
尝试删除self = this
并仅使用this
。
喜欢:
this.packageIndex = 0;
和this.storage.get(myString).then(...