在knockout.js

在knockout.js

问题描述:

绑定两个可观察我有两个简单的观测,例如,在knockout.js

val1 = ko.observable("input1"); 
val2 = ko.observable("input2"); 

,我希望他们能够像一个,所以当其中一个变化,另一个也会改变。

我知道,在通常情况下,最好只使用一个可观察,并将其绑定到多个DOM元素。但对我来说theese可观察生活在不同的模板和对象,所以它们不能被一个变量。

目前我订阅一个可观察到另一个,反之亦然:

val1.subscribe(function(v) { 
    val2(v); 
}); 
val2.subscribe(function(v) { 
    val1(v); 
}); 

但是当你改变一个的值可观察到的,它更新了第二位,但引起了连锁反应,再次更新了第一位,无限广告。

我怎样才能建立一个双向的两个独立的观测它设置在修改其他没有造成一个死循环的价值之间的绑定?

+0

你一定要使用一个属性是不可能的?你能提供一些你想要完成的细节吗? –

+3

手动订阅将是一个好方法。如果你正在寻找一个解决方案,帮助分离视图模型之间的沟通,那么你可以考虑类似:https://github.com/rniemeyer/knockout-postbox。这取决于你的情况。你可以做的另一件事就是在两个视图模型中引用相同的可观察元素。他们可以有不同的名字等,但他们会指向相同的可观察的。 –

+6

这个问题很不错。我不明白为什么那些人关闭它。 – Adaptabi

你可以做这样的事情:

vm1 = { 
    val1: ko.observable('input1'), 
    otherProperty: ko.observable('more') 
} 

vm2 = { 
    val2: vm.val1, 
    otherProperty: ko.observable('data') 
} 

两个vm1.val1vm2.val2决心同样观察到,因此相同的值。

塞提的回答会的工作,但是这可能与computed observables

例得到更好的服务:http://jsbin.com/exipuq/1/edit

var viewModelA = function(){ 
    this.myVal = ko.observable(); 
}; 

var viewModelB = function(otherViewModel){ 
    this.compVal = ko.computed(function(){ 
    return otherViewModel.myVal(); 
    }); 
}; 

// create a new viewmodel like normal 
var vma = new viewModelA(); 

// pass the instantiated view model 
// into the new one you're creating  
var vmb = new viewModelB(vma);