【问题标题】:Durandal: Accessing one view model from anotherDurandal:从另一个视图模型访问一个视图模型
【发布时间】:2013-04-13 08:59:00
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: viewmodel single-page-application durandal


    【解决方案1】:

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

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

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

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

    请注意,这将 sugar syntax 用于 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
        };
    });
    

    【讨论】:

    • 玩了一下,喜欢这种方法。我正在遵循我有一个托管应用程序的 shell 模型的模式。所以我想我可以将缓存的对象放在该模型上,并且从每个视图模型中,只需使用 require() 来获取对该始终加载的模块的引用,然后访问/修改该模块上的属性。我尝试使用单独的缓存模型,但只有我的一个视图可以看到它...
    • 如果你还没有的话,你可能想看看微风JS。它对缓存有很好的支持。
    • BreezeJS 对我来说不是一个明确的选择,因为在我的情况下(SharePoint 2013),我不能在盒子上放置任何服务器端代码。我只能使用现有的库(客户端 JavaScript OM)和 OOTB REST 服务。
    • @AndrewConnell 从 BreezeJS 的文档看来 BreezeJS 可以在没有服务器端更改的情况下工作。请参阅此示例 (breezejs.com/samples/edmunds) 以获得灵感。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2012-12-30
    • 2011-08-09
    • 2021-09-24
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    相关资源
    最近更新 更多