4

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

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

  • 从 vmEmployees 中,获取对 vmCompanies 的引用
  • 如果 vmCompanies 已经被初始化(我知道这是 99% 的时间),获取对它的引用,以便我可以使用 linq.js 之类的东西来查找该员工工作的特定公司
  • 如果 vmCompanies 尚未初始化(又名:激活),请执行此操作

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

4

1 回答 1

9

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

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

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

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

请注意,这使用了require 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
    };
});
于 2013-04-13T00:42:21.087 回答