2011-10-26 42 views
1

我有一個問題,即第二次從服務器更新數據時沒有調用init:函數。KnockoutJs - 爲什麼init綁定處理程序只被調用一次?

這有可能發生嗎?

我正在使用映射插件。另一個我不明白的問題是,我是否需要根據這是第一次呼叫還是第二次呼叫來調用映射插件函數?

JS

function ViewMemberPopup(memberId) { 

     $.get("/People/GetMemberDetails?memberId=" + memberId, function (data) {    
      viewMemberModel.model = ko.mapping.fromJS(data);    
      ko.applyBindings(viewMemberModel.model, $("#memberDetailsContainer")[0]); 
     }); 
    } 


// binding handler 
ko.bindingHandlers.renderMemberModal = { 
     init: function (element, valueAccessor, allBindingsAccessor) { 
      $(element).modal("show");    
     } 
    }; 

HTML: 我用renderMemberModal:真正的結合處理,不知道爲什麼我需要連接到它的屬性。我只需要調用渲染功能...

 <div class="modal fade" id="viewMemberModal" data-bind="renderMemberModal: true" style="display: none;"> 
     <div class="modal-header"> 
      <a class="close" href="#">×</a> 
      <h3> 
       Member Details</h3> 
     </div> 
     <div class="modal-body"> 
      <div data-bind="template: { name: 'memberDetailsTemplate' }"> 
      </div> 
     </div> 
     <div class="modal-footer"> 
      <a class="btnx closeModal">Close</a> 
     </div> 
    </div> 

我使用引導CSS來顯示模式彈出。

回答

2

您通常不想在每次更新時都對同一個元素繼續調用applyBindings。這可能最終會根據您使用的綁定添加多個事件處理程序。如果你這樣做,那麼你至少要在元素上調用ko.cleanNode。喜歡的東西:在每次更新http://jsfiddle.net/rniemeyer/F4AzB/

而不是調用applyBindings,我認爲這是更容易讓template結合(或控制流綁定是包裝的模板綁定)處理更新內容。

您的viewModel可以有一個可觀察值來表示您的數據。然後,您可以使用數據的新副本更新該可觀察項。

在這種情況下,你真的想要做的是有你的自定義綁定只是有一個更新功能,並確保訪問主觀察到的,所以它觸發每次調用您的更新功能的時間。

ko.bindingHandlers.custom = { 
    update: function(element, valueAccessor) { 
     ko.utils.unwrapObservable(valueAccessor()); //just for subscription 
     console.log("hit"); 
    } 
}; 

會是這個樣子:http://jsfiddle.net/rniemeyer/dNsW8/

+0

只是想經歷和了解的樣品。 ko.mapping.fromJS(dataFromServer,null,viewModel.myData()) - 爲什麼3個參數,我認爲它只需要2?有沒有關於此的文檔? – jaffa

+0

此外,我得到「$數據未定義的錯誤」? http://pastie.org/2766651。 – jaffa

+0

ko.mapping.fromJS可以帶三個參數。第一個是數據,第二個是映射選項,第三個是要更新的對象。如果您正在處理要更新的已映射對象,則可以將其作爲第二個參數傳遞,因爲它不需要再次映射選項,並且會識別出您已經傳遞了已映射的對象而不是映射選項。 –

1

在Knockoutjs網站http://knockoutjs.com/documentation/custom-bindings.html討論了自定義綁定。

Knockout會爲您使用綁定的每個DOM元素調用一次init函數。 init有兩個主要用途: - 爲DOM元素設置任何初始狀態 - 要註冊任何事件處理程序,以便(例如)當用戶單擊或修改DOM元素時,可以更改相關可觀察

因此,通過設計,Init只被調用一次來設置綁定。配置DOM對象的目的是讓Update方法正確工作。

相關問題