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

Calling between viewmodels (KnockOutJS)

本文关键字:KnockOutJS 调用 之间 视图 模型      更新时间:2023-09-26

我正在使用KnockoutJS开发一个基于视图模型的插件。是否有任何方法可以访问在同一应用程序中运行的另一个视图模型的函数和属性?类似这样的东西:

我的视图模型:

    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并设置这些属性?

或者有什么方法可以在全球范围内获取和设置它们吗?

请谨慎行事,因为我对这种模式还很陌生。非常感谢。

我同意使用作用域的注释,但有几种快速而肮脏的方法。。。

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

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

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

如果myViewModel.xyz=ko.obstatible(),那么在没有parens的情况下传递它会将其作为可观察对象传递——这将随着其值的变化而变化。使用parens将在评估结果时传递结果。

或者,您可以使用类似的ko.dataFor来引用它。

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
}

这将使您的对象仅限于页面的一部分