2013-05-21 168 views
0

我有一个聚合视图,它将多个视图分离出来(有点像局部视图,主视图允许我访问视图模型,而不管视图页面)。在淘汰赛中是否有某种方式可以引用另一个视图中的属性?我有一个输入框,我想在一个虚拟机中激发一个ajax请求,但我也需要它在另一个虚拟机中激发请求。我知道我可以将它们链接在一个虚拟机的内部,但我不想明确引用单独的虚拟机,如果我不需要的话。Knockout JS交叉视图模型引用

主视图具有的

function AggregateViewModel() { 
    var self = this; 
    self.vm1= new FirstViewModel(); 
    self.vm2= new SecondViewModel(); 
    self.vm3= new ThirdViewModel(); 

}

的形式,我想类似的输入绑定到

<input data-bind="click: vm1.inputValue, click: vm2.inputValue"> 

,这样我可以火上一样都AJAX事件点击事件。

感谢所有帮助/意见

+1

可能的重复http://stackoverflow.com/questions/9761457/knockoutjs-multiple-bindings-on-click-event –

回答

2

不能绑定两个点击处理,第二次将首先覆盖。但是你可以聚集他们查看模式:

function AggregateViewModel() { 
    var self = this; 

    self.vm1 = { 
     handleClick: function() { 
      console.log('vm1'); 
     } 
    }; 

    self.vm2 = { 
     handleClick: function() { 
      console.log('vm2'); 
     } 
    }; 
    self.vm3 = {}; 

    self.handleClick = function() { 
     console.log('Wrapper'); 
     self.vm1.handleClick(); 
     self.vm2.handleClick(); 
    }; 
} 

并绑定到单一的功能:

<input type="button" value="test" data-bind="click: handleClick" /> 

JSFIDDLE,与控制台打开。

+0

这是正确的方向,它开始进入一个更大的应用程序体系结构问题具体而言,如何从概念上组织应用程序的行为。如果我们重新审视一个ViewModel的概念,我们认为它不是呈现的不可知论,但仍然针对特定的视图。它的责任范围可以被限制为充当应用程序中其余逻辑的入口。我会考虑采用面向服务的体系结构(或其他任何你选择的)来封装应用程序中最实际的行为。虚拟机仅提供访问权限。 –

+0

这很好,但是如何添加两种方法都可以访问的输入?把一个observable放在AggregateViewModel中?每个句柄点击函数都将一个字符串作为参数,并且该字符串来自单个输入字段。 –