使用Durandal,我的应用程序中有两个视图模型,我们说vmCompanies &vmEmployees。我有两个视图,每个视图模型一个,在每个视图模型中,你可以看到所有的公司&所有员工。
但是,当我加载我的员工时,在DB中他们有一个他们受雇于的公司的ID。我要做的是下面的pseudo:
- 从vmememployees中获取对vmCompanies的引用
- 如果vmCompanies已经被初始化(我知道它是99%的时间),得到一个引用,这样我就可以使用linq.js这样的东西来找到这个员工为 工作的特定公司
- 如果vmCompanies尚未初始化(即:激活),则这样做
这样我就可以避免vmEmployees拥有自己的公司内部缓存的要求。到目前为止,我还无法弄清楚如何在Durandal中查询并请求"给我这个已经加载的视图模型"。似乎它有内部,因为当我浏览视图之间,他们被缓存,而不是重新加载(与虚拟机相同)…到目前为止,我还不知道如何我可以做到这一点。
您可以通过其____moduleId____手动require()
视图模型。只要你的视图模型模块返回一个对象而不是一个函数,你就会处理一个单例,所以你可以确保你会得到正确的实例。
如果你不确定__moduleId__是什么,你可以使用这个chrome扩展来查看你的视图模型的属性,包括__moduleId__。
然而,与其手动实例化vm,更好的替代方法可能是创建一个单独的模块,用于存储缓存的公司。我有一个数据模块,它有自己的内部缓存,我通常将其用于此目的,但您可以专门为公司创建一个,并将该信息存储在其中。如果合适的话,它甚至可以负责加载自己的数据。
下面是一些简单的代码来帮助解释:
注意,这里使用的是require JS的sugar语法——如果你使用的是基于数组的语法,你需要进行相应的翻译。如果需要的话我可以帮忙。
//companies-cache.js
define(function(require){
//some auto-loading logic here, if you wish
var companies = ko.observableArray([]);
return {
companies: companies
};
});
//vmCompanies, vmEmployees
define(function(require){
var companiesCache = require("viewModels/companies-cache");
//additional properties for this specific VM
...
return {
companies: companiesCache.companies
};
});