在knockout.js中绑定两个observable

时间:2012-10-06 11:39:27

标签: binding knockout.js observable subscribe

我有两个简单的可观察对象,例如,

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

我想让它们像一个人一样行动,所以当其中一个改变时,另一个也会改变。

我知道在一般情况下,最好只使用一个observable并将其绑定到多个dom元素。但在我的情况下,theese observables生活在不同的模板和对象中,因此它们不能是一个变量。

目前我订阅了一个observable到另一个,反之亦然:

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

然而,当您更改一个observable的值时,它会更新第二个,但这会导致连锁反应并再次更新第一个,无限期。

如何在两个单独的observable之间设置一个双向绑定,当你修改另一个而不会导致无限循环时,它会设置一个值?

2 个答案:

答案 0 :(得分:0)

您可以这样做:

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

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

vm1.val1vm2.val2都解析为相同的可观察值,因此值相同。

答案 1 :(得分:0)

Sethi的答案可行,但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);