【问题标题】:Knockout observable/viewmodel that can be accessed by other viewmodels?淘汰其他视图模型可以访问的可观察/视图模型?
【发布时间】:2013-09-26 04:45:30
【问题描述】:

我正在建立一个 SPA,一切进展顺利。它有多个动态构建的 Viewmodel,并且可以有多个相同类型,即您可以打开两个计算器,每个都有自己的模型,绑定到页面上的特定 div。

最近我意识到有几个视图模型从 Web 服务请求相同的数据,并且每 30 秒 - 1 分钟循环一次。因此,每 30 秒多次调用相同的服务,但返回的信息相同。

所以我想弄清楚的是如何创建一个“全局”observableArray,多个 viewModel 可以被通知更改和更新,而不是自己做,这也有助于确保页面上的数据是一致。

我希望我可以这样做:

var GlobalData = (function() {
    var commonData = ko.observableArray();
    setInterval(function() {...go get data...commonData(data);}, 30000);
    return {CommonData:commonData}
})();

ko.applyBindings(GlobalData, $('#RandomLonelyDiv')[0]);

后来

function Calculator(element){
    function init() { ko.applyBindings(calculator, $(element)[0]); }
    var calculator = {
        CommonData = GlobalData.CommonData
    }
    return calculator;
}

如果它有助于我没有包含所有其他视图模型的 MainViewModel 的唯一原因是因为坦率地说我不知道​​如何为我的环境设置它。

我有一个 AppViewModel,其中包含一个名为 Windows 的 ko.observableArray,其中包含定义选项/信息以构建某些窗口类型的对象。

<!-- ko template:{name:'WindowTemplate', foreach:SelectedTab().Windows} --><!-- /ko -->

然后我有一个自定义窗口绑定,它创建一个修改后的 kendoWindow,它创建一个特定类型的新视图模型,例如计算器,就像我说的那样,您可以同时拥有多个计算器。但是当我开始这个时,我并不确定如何将该视图模型放入我的 AppViewModel 中。也许它只是另一个数组?

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    听起来您真正需要的是“Pub/Sub”模型。这将允许您发布和订阅不知道其生成或目的地的消息。查看https://github.com/postaljs/postal.js/wiki

    【讨论】:

    • 非常好。我希望仅使用 Knockout 来完成此操作,但我很可能不得不使用单独的 pub/sub 系统。
    • 事实上,Ryan Niemeyer 已经编写了一个 Knockout pub/sub 库! knockmeout.net/2012/05/using-ko-native-pubsub.html 感谢您的回答帮助我找到了这幅很棒的作品。
    • 很高兴它有帮助 - 我忘记了 Ryan 的 pub/sub,谢谢提醒!
    【解决方案2】:

    我相信这可能就是你要找的东西:http://jsfiddle.net/xSKyR/474/

    您可以像这样订阅另一个视图模型的可观察对象..

    var ViewModel1 = function () {
        var self = this;
        self.something1 = ko.observable("1");
        self.clickMe = function (data, event) {
            self.something1("2");
        };
    };
    var ViewModel2 = function () {
        var self = this;
        self.something2 = ko.observable();
        vm1.something1.subscribe(function (newValue) {
            self.something2(newValue);
    
        });
    };
    var vm1 = new ViewModel1();
    var vm2 = new ViewModel2();
    ko.applyBindings(vm1, document.getElementById("vm1"));
    ko.applyBindings(vm2, document.getElementById("vm2"));
    

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 2014-03-13
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      相关资源
      最近更新 更多