在视图模型之间调用(KnockOutJS)

时间:2014-10-25 12:48:34

标签: javascript html knockout.js viewmodel knockout-viewmodel-plugin

我正在使用KnockoutJS开发基于viewmodels的插件。有没有办法访问在同一个应用程序中运行的另一个viewmodel的功能和属性?像这样:

我的观点型号:

    function myViewModel()
    {
        this.prop1 = ko.observable(123);
        this.prop2 = ko.observable("Hello");
        ..
        ..
    }

    myViewModel.prototype.func1 = function() {
        //do something...
    };

    myViewModel.prototype.func2 = function() {
        //do something...
    };

和另一个视图模型:

    function otherViewModel()
    {
        this.propA = ko.observable(456);
        this.propB = ko.observable("Goodbye");
        ..
        ..
    }

    otherViewModel.prototype.funcA = function() {
        //do something...
    };

    otherViewModel.prototype.funcB = function() {
        //do something...
    };

otherViewModel 的可观察量控制某些常见功能,如弹出窗口和蒙版。有没有办法在 myViewModel 中实例化 otherViewModel 并设置这些属性?

或者有没有办法全局获取和设置它们?

因为我对这个范例很陌生,所以请轻描淡写。谢谢。

1 个答案:

答案 0 :(得分:0)

我同意使用范围的评论 - 但有几种快速而肮脏的方式......

当你实例化myViewModel时 - 你可以在窗口上实例化它 - 然后直接引用它

window.myViewInstance = new myViewModel()

function myOtherViewModel () {
  this.propA = myViewInstance.xyz
}

当我有一些提供我想在其他地方使用的全局功能的东西时,我使用这种方法。它是jQuery和ko所做的...将$和ko绑定到窗口。

如果myViewModel.xyz = ko.observable()然后在没有parens的情况下传递它将其作为一个observable传递 - 它将随着其值的变化而改变。 parens将在评估结果时通过结果。

或者 - 您可以使用ko.data这样引用它。

myViewModel () {...}
instance = new myViewModel
ko.applyBindings(instance, $('div')[0])
// this applies bindings of myViewModel to the first div on the page only

myOtherViewModel () {

  this.propA = ko.dataFor($('div')[0])
  // passes the entire object
  this.propB = ko.dataFor($('div')[0]).xyz
  // gives you just one property

}

将您的对象范围限定为页面的一部分