2012-10-06 56 views
4

綁定兩個可觀察我有兩個簡單的觀測,例如,在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

回答

0

你可以做這樣的事情:

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

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

兩個vm1.val1vm2.val2決心同樣觀察到,因此相同的值。

0

塞提的回答會的工作,但是這可能與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);