我有一个Ionic 2应用程序,以列表的形式显示包内的用户项目。我创建了一个函数,用于检索Package中的当前Item索引,触发用户启动应用程序。它检查Ionic Storage(内部)内存中的索引名称 - 值对是否为空。在这种情况下,索引设置为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()
}
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');
}
)
});
}
答案 0 :(得分:0)
我认为发生这种情况的原因是因为全局变量self
被声明在我的每个页面和服务的顶部。这意味着当我运行self.storage.get(myString)
时,ItemStorageService
的构造函数正在运行并重新初始化self
以指向自身。
对此的解决方案不是在任何地方都使用self
,而是仅在需要它的地方使用(如内部回调函数),并确保将self = this
设置为尽可能靠近它的位置。 / p>
答案 1 :(得分:0)
尝试删除self = this
,然后使用this
。
喜欢:
this.packageIndex = 0;
和this.storage.get(myString).then(...