2013-07-19 50 views
2

通過Durandal(1.2版)使用Knockout Knockout Observable作爲AJAX調用的結果更新後不會更新綁定,但第一次除外。敲開可觀察的綁定僅在首次調用ajax後更新

視圖模型:

define(["require", "exports"], function(require, exports) { 
    var About = (function() { 
     function About() { 
      var _this = this; 
      this.Code = ko.observable("Initial Content"); 
      $.get("MyXml.xml", function (data) { 
       return _this.DataLoaded(data); 
      }, "text"); 
     } 
     About.prototype.DataLoaded = function (data) { 
      this.Code(data.toString()); 
     }; 
     return About; 
    })(); 


    return About; 
}); 

查看:

<div> 
    <h2>About</h2> 
    <p data-bind="text: Code"></p> 
</div> 

視圖模型被綁定到通過Durandals作曲家的觀點,但我碰到的香草淘汰賽同樣的問題。 第一次組合視圖時文件的內容被正確顯示,但是當視圖在該組合之後再次被組合時,該綁定在初始值之後未被更新。該文件被加載,並且調用更新observable的代碼,不會拋出任何錯誤。 以前我只是通過使用setInterval延遲更新來解決問題。這與第一次運作的事實相結合,因爲我認爲這是一個競賽條件錯誤。但我無法弄清楚會出現什麼問題。

是否有任何時間段您不應該更新可觀察值?有沒有一種好的模式來避免這種情況?

編輯

現在我使用viewAttached法(迪朗達爾)知道什麼時候它的安全更新,但我仍想知道的根本原因,並可能沒有更好的辦法。

回答

1

初始化的東西應該是安全的。我也使用激活掛鉤並在那裏返回一個承諾。不確定哪一個是最喜歡的事件。 我猜的根本問題是因爲您的Ajax調用缺少承諾。嘗試更改或至少使用$ .Ajax和async:false。