2013-03-26 63 views
3

我對淘汰賽還是比較新的,我試圖使用淘汰賽來顯示和隱藏bootstrap選項卡。KO計算不更新UI

基本上我有一個計算觀察到:

self.isActive = ko.computed(function() { 
      var selected = ko.utils.arrayFirst(self.padParticipant(), function (item) { 
       return item.ParticipationStatus == 'Active'; 
      }); 
      return selected !== null ? true : false; 
     }); 

更新這些選項卡:

<ul class="nav nav-tabs" id="padTabs"> 
     <li data-bind="fadeVisible: !isActive()"><a href="#joinPad">Join PAD</a></li> 
     <li class="active"><a href="#history">History</a></li> 
     <li data-bind="fadeVisible: isActive()"><a href="#update">Update Subscription</a></li> 
</ul> 

的計算工作正常在這個意義上,當我刷新了正確的標籤被隱藏的頁面,但我需要它的工作而不提神。

+0

so padParticipant是一個可觀察數組?是在$(document).ready(){}中設置的整個事情?另外,三元是必要的嗎?你可以說'return selected!== null;'? – dmoss18 2013-03-26 22:28:20

+0

這很奇怪,html是由某些東西自動生成的嗎?爲什麼綁定不同,並從中間失蹤?你可以嘗試在小提琴中複製行爲嗎? – Tyrsius 2013-03-26 22:31:28

+0

padParticipant是一個可觀察數組。是的,整個事件都設置在$(document).ready(function(){}。 – ThreadedLemon 2013-03-26 22:32:37

回答

8

問題有了解什麼是在淘汰賽框架發生時,你除了觀察到陣列的規則使用計算的觀測做。首先讓我們看一下關於觀察到的陣列一張紙條:

關鍵點:一個observableArray軌道哪些對象數組中 沒有這些對象

乾脆把對象裝進observableArray沒有按狀態不要使所有的對象的屬性都可以被觀察到。當然,如果你願意,你可以 使這些屬性可觀察,但這是一個獨立的選擇。 observableArray只跟蹤它保存的對象,並在添加或刪除對象時通知監聽器。

這是你在這行代碼做同樣的警告錯誤,因爲這不是一個可觀察的,而只是一個數組中的一個對象的屬性,: return item.ParticipationStatus == 'Active';

此外,我們需要了解如何計算觀察到的操作:

  1. 當你宣佈一個計算觀察到,KO立即調用其評估函數來獲取其初始值。

  2. 當你評估功能正在運行,KO會記錄任何觀測值(或計算觀測)你的評估讀取的 價值。

  3. 當您的評估者完成後,KO爲您已觸及的每個觀測值(或計算的觀測值)設置訂閱。 訂閱回調設置爲使您的評估程序再次運行, 將整個過程循環回第1步(處置不再適用的任何舊 訂閱)。

  4. KO通知任何訂戶有關您計算的observable的新值。

所以,當你做你的計算觀察到的,這是爲了監視更改的唯一認購是一個可觀察的陣列self.padParticipant()

由於狀態界面的更改取決於ParticipationStatus的更改,這意味着此屬性需要是數組中每個對象內的可觀察元素,否則當狀態發生更改時,將無法使計算結果爲意識到這一變化並更新UI。