2

我想完成一件非常简单的事情,但我无法弄清楚它是如何实现的,或者是否有可能。我正在使用热毛巾模板开始。在外壳视图模型中,我有一个用户可观察的。我希望能够引用从我网站上的其他页面观察到的用户。例如从主页。我尝试了几件事,但似乎我可以从组合视图访问 shell。我目前有一个可行的解决方案,它使用来自 shell 的事件 pub/sub 调用将用户数据传递给任何在数据更改时监听的人(本例中的主视图)。这行得通,只是看起来有点笨拙,并不是处理这个问题的理想方法。这个用户可观察的将需要在整个站点中使用,以确定某些功能何时可用并显示特定用户的项目。

有没有办法从主视图将数据绑定到包含在 shell 视图模型中的淘汰赛 observable?

4

3 回答 3

4

您可能会考虑拥有一个返回单例的 global.js,您可以根据需要将其包含在视图模型中。

define(function () {

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

在视图模型中使用全局。

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

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

});
于 2013-05-23T19:18:20.680 回答
0

最简单的方法是使用 requirejs 将 shell 模块导入到您的视图模型中,然后将 shell 视图模型作为模块视图模型上的变量公开。

像这样的东西:

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

然后在您看来,您可以使用 $root.shell 进行绑定

<span data-bind="text: $root.shell.shellObservable"></span>
于 2013-05-24T10:58:40.863 回答
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 对象的引用。

于 2015-02-11T20:52:54.377 回答