2014-01-31 47 views
0

我正在使用敲除本機模板來在頁面上使用某些示例數據呈現模板。使用新數據模型在下拉菜單的更改事件上敲擊重新呈現模板

下面的代碼加載一個網頁上的模板樣本數據

my.vm = { 
    load: function() { 
     $.each(my.sampleData.data.sections, function (i, p) { 
      // Sample Data Loading Happens HERE 
      // I wish to load different sample data on on-click 
      // event of #sampledata dropdown menu. The template 
      // should re render without a page refresh. 
      // Sample data is stored in db, have to get that using 
      // AJAX request 
     }); 
    } 
}; // End of My.VM 

my.vm.load(); 
ko.applyBindings(my.vm); 

以下是下拉菜單,點擊後,數據更新應該發生以下

<select id="sampledata"> 
    <option value="637">Sample Data 1</option> 
    <option value="697">Sample Data 2</option> 
    <option value="646">Sample Data 3</option> 
</select> 

響應代碼有新數據,但是當我使用該數據綁定時,綁定失敗

$('#sampledata').on('change', function(){ 
     var cvid = $(this).val(); 

       jQuery.post(
       MyAjax.ajaxurl, 
       { 
        action : 'getpost', 
        cvid : cvid 

       }, 
       function(response) { 
       //Response now have new data 
       my.vm.load(); 
          //But the apply bindings is not working for new data 
       ko.applyBindings(response); 

        } 
      ); 

     }); 
+2

到目前爲止您提出了什麼? – ebohlman

+0

http://stackoverflow.com/questions/18219830/knockout-mapping-re-rendering-everything這是我確實需要的,試着讓它工作 –

+2

第二個@ebohlman,這個問題目前讀取爲*要求*,而不是一個問題或一個問題。請包括您嘗試過的內容,並針對您遇到的問題進行具體說明。 – Jeroen

回答

0

您應該只撥打ko.applyBindings一次(最好在初始化期間),而不是每次載入新數據。如果您在同一個DOM部分多次調用它,則會出現錯誤。

閱讀關於處理<select>元素的options綁定;通過Knockout本身處理與用戶界面的交互,而不是使用jQuery手動操作DOM和設置處理程序是一個好主意。

1

根據您從AJAX返回的數據,您應該在viewModel上擁有.observable()或.observableArray()屬性。在返回AJAX調用時,只需將viewModel屬性\數組設置爲新數據即可。所有對observable()屬性的引用都將'自動'更新

通過聲明您的viewModel屬性爲可觀察的,您不需要'重新應用'綁定。

+0

沒有ko.applyBindings(響應);我得到的數據,它被成功添加到DOM,但以前綁定的數據不會被刪除。新數據只是附加到以前添加的數據。在綁定來自服務器的新數據之前如何刪除以前綁定的數據? –

+0

我不是KO的專家,但它似乎被設計爲公開和製作數據,而不是方法,可觀察。沒有看到更多的代碼會讓我感到困難。我會建議重構你的代碼,使.load()返回解析數據數組的非VM方法。從.load()返回的數據應該被分配給一個KO obseravable。 – Mikee