2015-11-24 33 views
0

我有一個Knockout視圖模型,它維護三件事:默認屬性列表,實體列表以及實體類列表。實體類每個都有可用實體的子集和覆蓋默認屬性的單獨屬性列表。Knockout.js:根據比較屬性確定可見性

我想要做的是突出顯示實體類具有覆蓋相應的默認值而不改變它的屬性的情況 - 所謂的「錯誤覆蓋」。我是Knockout新手,無法想出一個辦法來做到這一點。問題是它需要是一個計算屬性(如表更新頻繁,數據從服務器中檢索),這是基於比較視圖模型中較深的值和較淺的值。映射是這樣的:

function Master() //(view model) 
{ 
    var self = this; 
    self.EntityClasses = ko.observableArray(); 
    self.DefaultProperties = ko.observableArray(); 
    self.Entites = ko.observableArray(); 
} 

function EntityClass() 
{ 
    var self = this; 
    self.Properties = ko.observableArray(); 
} 

我期待比較這與在默認屬性列表屬性給定的實體,以一個屬性,以確定是否存在覆蓋不屬於不同的性質。比較將是其中下面是:

<div data-bind="foreach: EntityClasses"> 
    <span data-bind="if: PropertiesVisible"> 
    <h3><span data-bind="text: EntityClassName"></span> Properties</h3> 
    <table> 
    <tr><th>Property ID</th><th>Key</th><th>Value</th><th>Flags</th></tr> 
    <tbody data-bind="foreach: Properties"> <!-- in that entity class --> 
     <tr> 
     <td data-bind="text: PropertyID"></td> 
     <td data-bind="text: Key"></td> 
     <td data-bind="text: Value"></td> 
     <td> 
      <span data-bind="if: <SOME BOOLEAN>"> <!-- if equal to default --> 
      <!-- Indicate bad overwrite --> 
      </span> 
     </td> 
     </tr> 
     </tbody> 
    </table> 
    </span> 
</div> 
+1

我認爲我們將需要看到一些代碼。 –

回答

1

淘汰賽包括所謂computed obervables,它做你需要什麼。您可以使用ko.computed()創建它們。
如果您訪問傳遞給計算的observable的函數中的其他可觀察項,則計算結果將在依賴項更新時自動更新。

function Master() //(view model) 
{ 
    var self = this; 
    self.EntityClasses = ko.observableArray(); 
    self.DefaultProperties = ko.observableArray(); 
    self.Entites = ko.observableArray(); 
    self.overwritingProperties = ko.computed(function(){ 
     //compare properties 
     self.Entities.doSomething //<- when this observable updates (e.g. an entry is added), the computed observable is reevaluated automatically 
     var result = true; 
     return result; 
    }); 
} 

可以綁定他們像任何其他可觀察:

<span data-bind="if: overwritingProperties">