2012-03-08 108 views
1

我嘗試在我的頁面上綁定observableArraydiv並且一切正常。該陣列包含從WebService獲得的簡單的JSON對象,不可觀察。ObservableArray在項目發生變化時不會通知

之後,我希望能夠修改陣列中的這些對象,並希望每次修改都刷新視圖。例如,當點擊複選框時,我想更改我的JSON對象上的標誌(這似乎自動工作),同時我的UI應該更新,這不會發生。任何人都可以向我提供原因(這是因爲這些對象很簡單,不可觀察?)和解決方案?

var DocumentContentModel = function() { 
     var self = this; 
     self.content = ko.observableArray(); 
     self.ElementApprovalChanged = function (element) { 
      DocumentService.DoSomething(
       element.Id, 
       function (result) { 
        if (!result) { 
         var negatedApproved = !element.Approved; 
         element.Approved = negatedApproved; 
        } 
       }, 
       function (error) { 
        alert(error); 
       }); 
      return true; 
     }; 
    }; 

    $(document).ready(function() { 
     var contentModel = new ContentModel(); 
     DocumentService.GetContent(1, 
     function (result) { 
      contentModel.content(JSON.parse(result)); 
     }); 

     ko.applyBindings(contentModel); 
    }); 

UI

<div class="ContentContainer"> 
    <div data-bind='foreach: content'> 
     <div class="ContentElement" data-bind='css: { NotApproved: !Approved} '> 
      <div class="ContentValue" data-bind='html: Value'></div> 
      <div class="Approval"> 
       <input type="checkbox" data-bind='checked: Approved, click: $root.ElementApprovalChanged' /> 
      </div> 
     </div> 
    </div> 
</div> 

正在發生的事情是在複選框點擊我發送請求的web服務,如果此調用返回false我想重置元素的Approved標誌。即使沒有,選擇複選框應該改變div class屬性以在需要時將其標記爲NotApproved。但是沒有一個發生。

回答

3

observableArray只跟蹤數組。因此,如果添加,刪除或替換數組中的內容,這將觸發對視圖的更新。

observableArray不會跟蹤數組中項目的各個屬性的狀態。因此,如果您的對象上有一個Approved標誌,那麼這需要是用戶界面的可觀察值,以反映對該屬性的更改。

所以,你會碰到這樣的:

element.Approved = ko.observable(false); 
.... 
.... 

if (!result) {       
    var negatedApproved = !element.Approved();       
    element.Approved(negatedApproved);      
} 

(或者,如果你想更consise:

element.Approved(!element.Approved()); 

+0

是的,但我獲得了所有這些元素的數組從'WebService',我不能改變它們(或者我可以嗎?我遠不是'javascript'的專家)。所以我想知道是否有任何方法來重新評估數組綁定。 – Pako 2012-03-08 11:07:30

+1

沒問題,Pako。你需要knockout映射插件,這是爲了將JSON轉換爲ko對象並再次返回的目的。請參閱http://knockoutjs.com/documentation/plugins-mapping.html上的文檔 – 2012-03-08 11:11:12

+0

這正是我所尋找的,非常感謝! – Pako 2012-03-08 11:23:12

相關問題