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

And*_*ell 4 viewmodel single-page-application durandal

使用Durandal,我的应用程序中有两个视图模型,比如说vmCompanies和vmEmployees.我有两个视图,每个视图模型一个,在每个视图模型中,您可以看到所有公司和所有员工.

但是,当我加载我的员工时,他们在数据库中有一个ID,用于他们所雇用的公司.我想做的是以下伪:

  • 在vmEmployees中,获取对vmCompanies的引用
  • 如果vmCompanies已经初始化(我知道这是99%的时间),请参考它,这样我就可以使用像linq.js这样的东西找到这个员工工作的具体公司
  • 如果vmCompanies尚未初始化(也就是:已激活),请执行此操作

通过这种方式,我可以避免vmEmployees拥有自己的公司内部缓存的要求.到目前为止,我一直无法弄清楚Durandal如何查询并询问"给我这个已经加载的视图模型".它似乎在内部有这种情况,因为当我在视图之间导航时,它们被缓存而不是重新加载(与VM相同)......到目前为止还没有看到能做到的.

Jos*_*iel 9

您可以require()通过____moduleId____ 手动查看模型.只要您的视图模型模块返回一个对象而不是一个函数,您将处理一个单例,因此您可以确定您将获得正确的实例.

如果您不确定__moduleId__是什么,可以使用此chrome扩展来查看视图模型的属性,包括__moduleId__.

但是,不是手动实例化VM,更好的选择可能是创建一个单独的模块,用于存储缓存的公司.我有一个带有自己内部缓存的数据模块,我通常会为此目的使用,但您可以专门为公司创建一个,并将信息存储在其中.如果合适,它甚至可以负责加载自己的数据.

这里有一些简单的代码可以帮助解释:

请注意,这使用了需要JS 的糖语法 - 如果您使用基于数组的语法,则需要相应地进行翻译.如果需要我可以帮忙.

//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
    };
});
Run Code Online (Sandbox Code Playgroud)