我正在尝试找出一种方法来缓存我的 knockoutJS SPA 数据,并且我一直在尝试使用 amplifyJS。这是我的 GET 函数之一:
UserController.prototype.getUsers = function() {
var self = this;
return $.ajax({
type: 'GET',
url: self.Config.api + 'users'
}).done(function(data) {
self.usersArr(ko.utils.arrayMap(data.users, function(item) {
// run each item through model
return new self.Model.User(item);
}));
}).fail(function(data) {
// failed
});
};
这是相同的功能,“放大”:
UserController.prototype.getUsers = function() {
var self = this;
if (amplify.store('users')) {
self.usersArr(ko.utils.arrayMap(amplify.store('users'), function(item) {
// run each item through model
return new self.Model.User(item);
}));
} else {
return $.ajax({
type: 'GET',
url: self.Config.api + 'users'
}).done(function(data) {
self.usersArr(ko.utils.arrayMap(data.users, function(item) {
// run each item through model
return new self.Model.User(item);
}));
}).fail(function(data) {
// failed
});
};
这可以按预期工作,但我不确定我使用的方法,因为它还需要对addUser
,removeUser
和editUser
函数进行额外的工作。并且看到我在整个应用程序中有更多类似的功能,如果可能的话,我想避免额外的代码。
我找到了一种在 的帮助下处理事情的方法ko.extenders
,如下所示:
this.usersArr = ko.observableArray().extend({ localStore: 'users' });
然后,ko.extenders.localStore
只要检测到observableArray
. 因此,在初始化时它将写入observableArray
以防密钥存在本地存储数据,users
并且在更改时它将更新本地存储数据。
我对这种方法的问题是我需要通过模型运行我的数据,而我找不到从localStore
函数中执行此操作的方法,该函数保存在单独的页面上。
你们中有人与 KO 和 Amplify 合作过吗?你用了什么方法?我应该使用第一个还是尝试两者的组合并重写扩展器,使其仅更新本地存储而不写入observableArray
on init?