2012-10-05 45 views
0

我從一個Web API加載數據是這樣的:淘汰賽JS更新知名度基於物業價值

$.getJSON("/api/Rule", function (rules) { 
    self.Rules(rules); 
}); 

然後我使用foreach綁定綁定Rules到表。每個Rule具有以下屬性:Keyword,AttributeValue

我想檢查一下Keyword是否是控制某些控件可見性的某個值。

data-bind="options: viewModel.Attributes, visible : Keyword != 'Else'" 

問題是當我將Keyword的值更改爲不同值時,可見性未更新。

我如何得到這個工作?

如果它應該是通過某種綁定,我沒有在我的視圖模型中聲明一個特殊的對象,我只是使用從服務器返回的任何東西。

+0

結帳的淘汰賽映射插件:http://knockoutjs.com/documentation/plugins-mapping.html這將幫助你從JSON數據創建一個可觀察的。還請確保檢查您是否需要關鍵字或關鍵字()。我會用data-bind =「text:Keyword」添加一個span,這樣你就可以檢查這個值是什麼。當我有更多時間時,我會發布更完整的答案 –

+0

@WouterdeKort我確實放置了一個跨度,而我沒有看到關鍵字值未更新。使用關鍵字()也不起作用。它會拋出一個錯誤「功能預期」。我猜你不能在數據綁定設置中使用它。 –

+0

更新:我創建了一個與我的Web Api返回的對象完全相同的對象,稱爲Rule,而不是像上面那樣設置值,而是對返回的數據執行$ .each並手動創建了KO對象的集合然後我可以看到,在我關閉後,該值會被更新爲immadieatly。我怎樣才能做到這一點,而不是在KO中創建一種重複/冗餘的對象 –

回答

1

坦白說,你必須映射你的對象觀察。這就是淘汰賽如何能夠發揮它的魔力。使用mapping plugin將使這個微不足道。

$.getJSON("/api/Rule", function (rules) { 
    var mappedRules = ko.mapping.fromJS(rules); 
    self.Rules(mappedRules); 
}); 

否則,您可以自己映射它。

$.getJSON("/api/Rule", function (rules) { 
    var mappedRules = ko.utils.arrayMap(rules, function (rule) { 
     return { 
      Keyword: ko.observable(rule.Keyword), 
      Attribute: ko.observable(rule.Attribute), 
      Value: ko.observable(rule.Value) 
     }; 
    }); 
    self.Rules(mappedRules); 
}); 

請記住,您現在正在處理observables,因此您需要調整綁定。

data-bind="options: viewModel.Attributes, visible : Keyword() != 'Else'"