Javascript 在viewmodels(KnockOutJS)之间调用

Javascript 在viewmodels(KnockOutJS)之间调用,javascript,html,knockout.js,viewmodel,knockout-viewmodel-plugin,Javascript,Html,Knockout.js,Viewmodel,Knockout Viewmodel Plugin,我正在使用KnockoutJS开发一个基于viewmodels的插件。是否有任何方法可以访问在同一应用程序中运行的另一个viewmodel的函数和属性?大概是这样的: 我的视图模型: 另一个视图模型: otherViewModel的可观察对象控制某些常见功能,如弹出窗口和遮罩。有没有办法在myViewModel中实例化otherViewModel并设置这些属性 或者是否有任何方法可以全局获取和设置它们 请轻点走,因为我对这个范例非常陌生。谢谢。我同意关于使用范围的评论-但是有两种快速而肮脏的方法

我正在使用KnockoutJS开发一个基于viewmodels的插件。是否有任何方法可以访问在同一应用程序中运行的另一个viewmodel的函数和属性?大概是这样的:

我的视图模型:

另一个视图模型:

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

或者是否有任何方法可以全局获取和设置它们


请轻点走,因为我对这个范例非常陌生。谢谢。

我同意关于使用范围的评论-但是有两种快速而肮脏的方法

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

window.myViewInstance = new myViewModel()

function myOtherViewModel () {
  this.propA = myViewInstance.xyz
}
当我有一些提供全局功能的东西要在别处使用时,我会使用这种方法。这就是jQuery和ko所做的。。。将$和ko绑定到窗口

如果myViewModel.xyz=ko.observable,则在不使用parens的情况下将其传递为observable,这将随着其值的变化而变化。使用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

}

这将把你的对象范围扩大到页面的一部分

嗯,这是一个非常广泛的问题。您应该了解闭包、作用域和oo风格的JS编程。要获得更实用的方法,请仔细阅读文档。其中有许多示例,其中在视图模型之间创建了依赖关系。我在这里找到了一个更好的解决方案:
window.myViewInstance = new myViewModel()

function myOtherViewModel () {
  this.propA = myViewInstance.xyz
}
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

}