我决定为我的AJAX请求,模型和数据数组创建一个名为“controllers”的独立文件夹,所以如果我需要在多个页面上使用相同的请求,我就不必重复我的代码。
例如,在“app / page1 / index.html”上,我有一个包含所有用户的列表:
<ul data-bind="foreach: { data: usersArr }">
<li data-bind="text: full_name"></li>
</ul>
我需要page1的viewmodel中的用户控制器,然后通过它加载数据:
define(['jquery', 'knockout', 'controllers/user/index'], function ($, ko, User) {
var Page1 = function() {
this.usersArr = User.usersArr;
};
Page1.prototype.activate = function() {
User.getUsers();
};
return Page1;
});
这是用户控制器:
define(['knockout', './models',], function (ko, Model) {
var UserController = function() {
this.usersArr = ko.observableArray();
};
// inherit
UserController.prototype.Model = new Model();
UserController.prototype.getUsers = function () {
// ajax goes here, data comes back,
// put it through the Model and then save it to usersArr();
};
UserController.prototype.addUser = function () { ... };
UserController.prototype.removeUser = function () { ... };
return new UserController();
});
请注意,我将控制器作为对象返回。我这样做是为了让它保留在内存中,我可以重用其他页面上的代码(特别是带有存储数据的可观察数组)。现在,如果我创建一个'page2'并且需要相同的列表,则用户将已加载到usersArr
可观察数组中。
我有多个这样的控制器,应用程序将在整个会话中使用。我只是想知道这种方法是否有任何缺点,比如应用程序减速或我可能遇到的任何其他问题。我也很想知道你们是否有不同的方法来保持会话中的数据。
谢谢!
答案 0 :(得分:2)
我发现在SPA中保留信息的最佳方式是在所有视图中创建一个单例并引用该单例。
例如,这是我的一个修改版本:
define([], function() {
"use strict";
var countryList: []
return {
countryList: countryList,
};
});
然后我只需要在我的所有SPA上使用它。 CountryList由第一个视图[1]填写,数据可供所有其他人使用。
[1]在这个上下文中我们正在制作一个向导,所以他们必须按顺序浏览视图。
答案 1 :(得分:0)
我使用本地存储/会话存储中内置的浏览器来存储会话参数。即在js:
// set data
sessionStorage["key"] = someJsVar;
// get data
var myJsVar = sessionStorage["key"];