2013-04-12 52 views
4

使用Durandal,我在我的应用程序中有两个视图模型,比如vmCompanies & vmEmployees。我有两种观点,一种是针对每种视图模型和每种视图内的,您可以看到所有公司&所有员工。Durandal:从另一个访问一个视图模型

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

  • 从vmEmployees内,得到一个参考vmCompanies
  • 如果vmCompanies已经初始化(我知道这是99%的时间),得到一个参考,所以我可以使用类似linq.js找到特定的公司如果vmCompanies尚未初始化(又名该员工适用于
  • :激活),这样做

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

回答

9

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

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

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

下面是一些简单的代码,以帮助解释:

注意这里使用了sugar syntax的要求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 
    }; 
}); 
+0

围绕它玩了一下,就像这种方法。我遵循这个模式,我有一个托管应用程序的shell模型。所以我想我可以将缓存的对象放在该模型和每个视图模型上,只需使用require()获取对始终加载的模块的引用,并只访问/修改那个属性即可。我尝试使用单独的缓存模型,但只有我的一个视图可以看到它... –

+0

如果你还没有,你可能会想看看breezeJS。它对缓存有很好的支持。 –

+0

BreezeJS对我来说不是一个明确的选择(SharePoint 2013),我无法在该框上添加任何服务器端代码。我只能使用现有的库(客户端JavaScript OM)和OOTB REST服务。 –

相关问题