2013-07-09 124 views
0

在頁面加載我轉換JSON數據,查看模型這樣Knockout.js更新視圖模型

var jsonField = '#' + '<% = hdnField.ClientID %>'; 

        jsonModel= { 
         availables: ko.observableArray([]) 
        }; 


        var valueField = $(jsonField)[0].value; 
        var arrayGroup = $.parseJSON(valueField); 

        jsonModel.availables = ko.viewmodel.fromModel(arrayGroup); 

        var block=$('#availabilitiesBlock')[0]; 
        ko.applyBindings(jsonModel,block); 

在頁面加載後,我打電話ajax的服務器功能來更新這個視圖模型。

在塔AJAX的成功再打我已經寫了像

var updatedModel = { 
       availables: ko.observableArray([]) 

      }; 
      updatedModel.availables = ko.viewmodel.fromModel(data.d); 

當我嘗試更新與此更新的模型我的整個模型成爲視圖模型空白

我嘗試以下方法

  1. 將data.d推入oldModel.availables observable。當我推送數據時,aray對象不會被轉換爲可觀察對象,而是將這些項目添加到availables數組中。而在最初(頁面加載時),對象轉換沒有問題。

  2. 試圖直接更新的ViewModels並且在這種情況下,整個模型變爲空白

    ko.viewmodel.updateFromModel(oldModel,updatedModel);更新的模型

    Updated Model

    正如我所說的,當我推陣列對象直接(data.d)的

舊的剪斷模型

Old Model

剪斷,在ajax之前的第一種情況下,observables不會自動創建。

爲什麼當邏輯相同時會發生這種情況?我正在使用http://coderenaissance.github.io/knockout.viewmodel/自動映射對象。

任何指針將會很有幫助

回答

3

Rohith,這裏的答案將取決於你從你的Ajax調用返回的東西。

而不是創造的UpdateModel的,我相信從你的Ajax調用返回你想

ko.viewModel.updateModel(jsonModel.availables, data.d); 

如果您data.d從Ajax調用返回不需要任何特殊的映射(即它只是一個數組不需要觀測對象的),你可以簡單地更新你的模型直接

//ko.viewModel.updateModel(jsonModel.availables, data.d); 
jsonModel.availables(data.d); 

你正在運行到根本的問題是,你已經失去了可觀察到您的視圖綁定。通過覆蓋它,或者忽略jsonModel.availables並更新不同的模型(在這種情況下爲updateModel),您將失去jsonModel.availables。

我與AJAX工作時工作的一個博客帖子這個確切問題,但你可以看到你在這篇文章中的第三部分有問題的一部分:http://ryanrahlf.com/getting-started-with-knockout-js-3-things-to-know-on-day-one/

我希望這有助於!

+0

現貨:)我結束了使用ko.viewModel.updateModel(jsonModel.availables,data.d);但是由於腳本運行時間較長,導致我的用戶界面掛起 –

+0

當您在更改可觀察數組時看到很長的運行時間,請檢查在每個元素上運行的複雜進程(自定義綁定?),還是正在重新計算的敲除計算結果計算每個項目。 –

+0

@RyanRahlf這將工作與地圖插件?我發現我需要調用我的ajax回調函數中的applybindings。否則,該模型不會更新。我認爲地圖插件打破了訂閱的元素,並且無法更新它。 http://stackoverflow.com/questions/21558075/how-do-i-update-my-model-using-ajax-and-mapping-plugin/21568045#21568045 – Vyache