我的应用程序具有三个“全局”的东西:具有 lat 和 lng 值的用户位置、用户是否登录以及他们选择的活动(将其视为一个类别)。
我希望在整个应用程序中使用这些值。每个屏幕都会使用这个日期的一些集合,所以每页加载它不是正确的答案。除非用户创建事件:不同的位置、活动或登录/注销,否则信息也不会改变。
我应该如何设置?
我的想法是在启动时应该有一个初始加载,在我的 main.js 文件中我加载每个然后 app.start 像这样:
站点服务.js
define([...], function (...) {
return {
init: function () {
return $.when(
activityService.getStoredActivity(),
locationService.getStoredLocation(),
userService.getUsername()
);
}
}
});
main.js
定义([..., 'modules/siteService'], function (..., site) { ...
site.init().then(function () {
app.start().then(function () {
...
app.setRoot('viewmodels/shell', 'entrance');
});
});
});
这确实确保了数据已加载。从那里在我的每个服务中,我将信息存储到本地存储中,因此我不必继续触发 AJAX 调用。如果没有本地存储,它会。
当我在其他页面中需要这些数据时,问题就会出现。我最终在每个页面的激活方法中调用我的 site.init().then() 。这很草率。
外壳.js
self.activate = function () {
...
siteService.init().then(function (activity, location, username) {
self.activity(activity);
self.location(location);
setUsername(username);
});
return router.activate();
};
然后再次进入:
欢迎.js
this.activate = function () {
site.init().then(function(activity, location) {
loc = location;
act = activity;
load();
});
});
我想最初设置这些值,每个页面最初都从这些值加载,然后使用 Durandal 的 pub/sub 对事后的任何更改做出反应。
我正在考虑仅使用 pub/sub,但后来觉得在加载与页面加载相关的数据时,我会遇到先有鸡还是先有蛋的问题(IE 如果我的 AJAX 先加载,而我的页面没有加载,事件触发,但页面永远不会得到更新)。
是否可以在 javascript 中设置类似静态类的东西来最初提取数据,然后在整个视图模型中共享它?或者,有没有办法保证在我最初加载页面时该值存在,例如 app.on('value', { initialize: true })?