Breeze Durandal从视图访问shell viewmodel变量

时间:2013-05-23 18:36:41

标签: asp.net-mvc knockout.js breeze durandal

我想要完成一件非常简单的事情,但我无法弄清楚它是如何或甚至是可能的。我正在使用Hot Towel模板开始。在shell视图模型中,我有一个用户可观察的。我希望能够从我网站上的其他页面引用该用户可观察的内容。例如,从主页。我尝试了几件事,但它看起来好像我可以从组合视图访问shell。我现在有一个工作解决方案,它使用来自shell的事件发布/调用来将用户数据传递给任何在数据发生变化时监听的人(本例中的主视图)。这看起来有点笨重,并不是理想的处理方式。需要在整个站点中使用此用户可观察对象来确定何时应该可以使用某些功能并显示特定用户项目。

是否有办法将数据绑定到主视图中shell视图模型中包含的knockout observable?

3 个答案:

答案 0 :(得分:4)

您可以考虑使用返回单例的global.js,根据需要将其包含在视图模型中。

define(function () {

    return {
        sharedObservable: ko.observable(),
        sharedObservableArray: ko.observableArray(),
        ...
    };
});

在viewmodel中使用global。

define([..., global], function (..., global) {
    ...
    global.sharedObservable('updated');

    // As an alternative use a local var for easier access
    // var localVar = global.sharedObservable;
    // localVar('updated') 
    ...

});

答案 1 :(得分:0)

最简单的方法是使用requirejs将shell模块导入到viewmodel中,然后将shell viewmodel作为变量暴露在模块的viewmodel上。

像这样:

// Some viewmodel
define(['shell'], function(shell){
     var vm = {
         shell: shell,
         ...
     };
     return vm;
});

然后在您的视图中,您可以使用$ root.shell进行绑定

<span data-bind="text: $root.shell.shellObservable"></span>

答案 2 :(得分:0)

以前的答案都不适合我。因此,我尝试了另一种访问shell的变体,它完成了工作。

我的shell.js中有这个:

    define(['plugins/router', 'durandal/app'], function (router, app) {
      return {
        // I need an access to this array in my view
        breadcrumbs: ko.observableArray([]), 
        ...
        };
   });

这在我看来:

define(function () {
    var ctor = function () {
        this.pageTitle = 'Preview';
        this.activate = function () {
            require('viewmodels/shell').breadcrumbs([...]);
        };
    };
    return ctor;
});

因此,require('viewmodels / shell')实际上返回对shell对象的引用。