2014-12-31 26 views
3

我有一張表格,我計劃爲多人收集信息。很有可能每個人的回答可能都是相同的,但我希望給人們提供定製回答的能力,同時保持簡單。所以,我放在一起的例子:Knockoutjs:級聯寫入多個observables如果沒有價值嗎?

http://jsfiddle.net/r29xtLaq/1/

這是一個非常簡單的輸入形式:

<p>Person 1: <input data-bind='value: person1' /></p> 
<p>Person 2: <input data-bind='value: person2' /></p> 

在此的jsfiddle,我想它是這樣,當我填寫一個值person1,那麼該值將自動級聯到person2,因爲person2的值爲空。但是它們都由單獨的可觀察對象支持,因爲在爲用戶預先填充person2之後,她或他可以編輯person2,並且不會級聯回person1。

回答

2

你嘗試過什麼還沒有做到這一點?這應該相當簡單,在Knockout中實現自定義擴展程序,該擴展程序訂閱了值更改並檢查其他人是否爲空並將其填入其中。

Ex。擴展 -

ko.extenders.setOthersOnChange = function(target, others) { 
    target.subscribe(function(newValue) { 
     ko.utils.arrayForEach(others, function (other) { 
      if (!ko.unwrap(other)) { 
       other(newValue); 
      } 
     }); 
    }); 
    return target; 
}; 

而在你的虛擬機 -

this.person2 = ko.observable().extend({ setOthersOnChange: [] }); 
this.person1 = ko.observable().extend({ setOthersOnChange: [this.person2] }); 

這樣做的好處是,你可以有n其他一些相關的觀測值不增加你有多少訂閱手動創建。我也建議確保你妥善處理它們。

參考

更新小提琴

http://jsfiddle.net/r29xtLaq/3/

+0

聰明的解決方案。謝謝! – BenjiFB

1

您可以subscribeperson1的變化,並把它的值上person2只有當後者仍然是空的:

var self = this; 

this.person1.subscribe(function(val) 
{ 
    if (!self.person2()) 
     self.person2(val); 
}); 

瞭解改Fiddle

1

如果你想從PERSON1級聯到PERSON2你中央社這樣做。

http://jsfiddle.net/r29xtLaq/1/

// Here's my data model 
var ViewModel = function(first, last) { 
    var self = this; 
    self.person1 = ko.observable(first); 
    self.person2 = ko.observable(last); 
    self.person1.subscribe(function(newValue) { 
      if(self.person2() == '')  
      self.person2(newValue); 
    }); 
} 
ko.applyBindings(new ViewModel("", "")); 
+0

感謝您的答覆!如果你知道你只有一個可觀察的情況,那麼可能會更簡單。 – BenjiFB