5

たとえば、2つの単純なオブザーバブルがあります。

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

ひとつのように振る舞ってほしいので、どちらかが変わればもう一方も変わります。

一般的なケースでは、観測可能なオブジェクトを 1 つだけ使用して、複数の dom 要素にバインドする方がよいことを私は知っています。しかし、私の場合、これらのオブザーバブルは異なるテンプレートとオブジェクトに存在するため、1 つの変数にすることはできません。

現在、あるオブザーバブルを別のオブザーバブルにサブスクライブし、その逆も同様です。

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

ただし、1 つのオブザーバブルの値を変更すると、2 番目の値が更新されますが、波及効果が発生し、最初の値が無限に更新されます。

無限ループを引き起こすことなく、一方の値を変更するときに他方の値を設定する、2 つの個別のオブザーバブル間の双方向バインディングを設定するにはどうすればよいですか?

4

2 に答える 2

0

次のようなことができます。

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

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

と の両方が同じオブザーバブルvm1.val1vm2.val2解決されるため、同じ値になります。

于 2012-10-07T10:50:47.410 に答える
0

Sethiの答えは機能しますが、これは計算されたオブザーバブルでより適切に提供される可能性があります

例: 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);
于 2012-10-08T19:57:49.497 に答える