2016-08-30 60 views
0

我是一種ko.computed,我希望應該根據observableArray上的添加/刪除操作進行更新,但它沒有,所以我可能在這裏丟失了重要的東西。所以,我有一個觀察的陣列,在這裏它是:Ko.computed沒有更新

vm.selTopics({ 
    topics: [], 
    members: [], 
    children: [] 
}); 

然後我對主要議題陣列中的項目列表中的複選框,我打印應用計算每個項目的列表。只要在vm.selTopics()中添加或刪除一個項目,就可以隨時更新計算結果,並隨時在vm.selTopics()中找到該項目時複選該複選框。下面是代碼:

member.isSelected = ko.computed({ 
      read: function(){ 
      if(_.where(vm.selTopics().members, { id: member.tid, topicId: topic.tid }).length > 0){ 
       return true; 
      } 
      }, 
      write: function(val){ 
      if(_.where(vm.selTopics().members, { id: member.tid, topicId: topic.tid }).length === 0) { 
       vm.selTopics().members.push({ 
       id: member.tid, 
       label: member.label, 
       topicId: topic.tid 
       }); 
      } else { 
       vm.selTopics().members.splice(_.findIndex(vm.selTopics().members, { id: member.tid, topicId: topic.tid }),1); 
      } 
      } 
     }); 

然後我已經另一個計算其表示一個複選框,如果選中,檢查當前部件複選框以及那些其孩子。這裏它代碼爲:

member.isActive = ko.computed({ 
      read: function(){ 
      if(member.children.every(function(c){ return c.isSelected() }) && member.isSelected()){ 
       member.isOn('isOn'); 
       return true; 
      } else { 
       member.isOn(''); 
      } 
      }, 
      write: function(val){ 
      if(member.children.every(function(c){ return c.isSelected() }) && member.isSelected()){ 
       member.isSelected(false); 
       member.children.forEach(function(c){ 
       c.isSelected(false); 
       }); 
      } else { 
       member.isSelected(true); 
       member.children.forEach(function(c){ 
       c.isSelected(true); 
       }); 
      } 
      } 
     }); 

但是,當我點擊這個複選框member.isSelected計算不會得到重新評估。 (只是要確切地說,vm.selTopics()是一個單維數組,之前一切正常......)。也許我錯過了關於觸發器如何工作的一些重要部分。謝謝你的幫助。

UPDATE

下面是HTML:

<input\ 
    type="checkbox" 
    name="topics" 
    data-bind=" 
    checked: isSelected, 
    value: tid, 
    "> 
<!-- Checkbox to select current member & its children --> 
<label data-select="multi" data-bind=" 
    css: isOn, 
    visible: $data.children.length, 
    event: { mouseover: $component.highlight, mouseout: $component.unlight }, 
    "> 
    <input type="checkbox" 
     data-bind="checked: isActive" 
    > 
</label> 
<!-- /ko --> 
+0

嗨,分享HTML,看看你是如何綁定屬性 – frankfg

回答

1

存儲在可觀察的對象不會使其性能觀測。如果您想對selTopics.members陣列的更改做出反應,那麼這也必須是可觀察的。除非該對象總是以原子方式更新(例如來自AJAX調用的數據),否則通常不需要可觀察對象。

vm.selTopics = { 
    topics: [], 
    members: ko.observableArray(), 
    children: [] 
}; 
+0

嗨邁克爾,非常感謝。我需要它是一個可觀察的,因爲用戶可以添加/刪除項目,這個計算器更新其他組件中的一些觀察值。爲什麼我應該觀察我想觀看的物體的每個屬性是否有原因?性能? –