2013-04-23 154 views
3

我有一個對象:淘汰賽訂閱觀察的對象

{ model: settings: { "FirstName": "Joe", "LastName": "Bloggs" } }; 

在我看來,我的模型進行設置,可觀察到:

this.Settings = ko.observable(ko.mapping.fromJS(model.settings)); 

這使得FirstNameLastName可觀了。

在我看來,我結合做:

<p data-bind="text: Settings().FirstName"></p> 

Settings我讀值:

`this.Settings().FirstName()` 

的問題出現時,我想,當訂閱FirstNameLastName變化。

我知道我可以做this.Settings.FirstName.subscribe...但是,一旦你得到兩件以上的事情,這是很痛苦的。

有沒有辦法做this.Settings.subscribe...?或者我應該使用自定義綁定?

回答

0

通過使用計算的observables,您可以在任何這些依賴關係發生更改時自動更新。例如,當名字或姓氏改變時,FullName將被更新。

this.Settings().FullName = ko.computed(function() { 
    return this.Settings().FirstName() + " " + this.Settings().LastName(); 
}); 

KnokcoutJS.com

注借:我會努力多一點,使視圖模型少許清潔劑。

+0

是的,謝謝你。但我試圖找到一種訂閱更改的方式,而不列出所有的子屬性,因爲Settings對象具有大約20-30個子屬性。當你列出每個孩子的財產時,會非常痛苦。此外,如果你刪除/重命名一個兒童財產一切都打破了,所以如果你可以訂閱父母的水平,這將是理想的:) – Colin 2013-04-24 01:24:49

+0

這是沒有提到你的問題。無論如何,你可以做一些像Ryan爲dirtyFlag所做的自定義綁定(下面的鏈接)。 這個概念是比較對象的初始狀態(映射之前)到對象的當前狀態(通過轉換爲JSON)。 讓我知道如果這不能解決您的問題。 http://www.knockmeout.net/2011/05/creating-smart-dirty-flag-in-knockoutjs.html – KhanSharp 2013-04-24 11:04:42

0

你應該嘗試mapping plugin,它可以讓你把純JSON對象並將其轉換爲全視圖模型。

基本上它的每個對象上的每個成員轉換爲可觀察到的:

var data = { "FirstName": "Joe", "LastName": "Bloggs" }; 
var viewModel = ko.mapping.fromJS(data); 

然後,你可以這個視圖模型到HTML綁定屬性通俗易懂的結合是這樣的:

<p data-bind="text: FirstName"></p> 

這是一個小例如,我只映射了一個普通對象,但如果您想轉換示例中的嵌套對象,也可以實現更復雜的映射。文檔中有關於此的更多信息。