Durandal:从一个视图模型访问另一个视图模型



使用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
    };
});

相关内容

  • 没有找到相关文章

最新更新