2012-01-13 8 views
1

次のコードは、ハードコードされた配列(initialData1)でうまくいきますが、モデルを初期化するためにjquery .ajax(initialData)を使用する必要があります。.ajaxデータでknockoutjsビューモデルを初期化する方法

$(function() { 

     function wiTemplateInit(winame, description) { 
      this.WIName = winame 
      this.WIDescription = description 
     } 

     var initialData = new Array; 

     var initialData1 = [ 
      { WIName: "WI1", WIDescription: "WIDescription1" }, 
      { WIName: "WI1", WIDescription: "WIDescription1" }, 
      { WIName: "WI1", WIDescription: "WIDescription1" }, 
     ]; 
     console.log('gridrows:', initialData1); 

     $.ajax({ 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      data: "{UserKey: '10'}", 
      url: "WIWeb.asmx/GetTemplates", 
      success: function (data) { 
       for (var i = 0; i < data.d.length; i++) { 
        initialData.push(new wiTemplateInit(data.d[i].WiName,data.d[i].Description)); 
       } 
       //console.log('gridrows:', initialData); 
       console.log('gridrows:', initialData); 
      } 
     }); 

     var viewModel = function (iData) { 
      this.wiTemplates = ko.observableArray(iData); 

     }; 

     ko.applyBindings(new viewModel(initialData)); 

    }); 

しかし私は、ほとんどすべての例は、ビューモデルに渡されるハードコーディングされたデータを示し、knockoutjsのウェブサイト上の例から作業しようとしています。

+0

のようなものを使用してみてください、あなたは戻ってくるかを確認するために、ネットワークの伝送をデバッグしていますか?何かが戻ってくるかどうかを確認してください。そうであれば、そのデータはどのような形状ですか?ハードコードされた日付と同じですか?エラーはありますか? –

+0

"しかし、ほとんどすべての例では、ハードコードされたデータがビューモデルに渡されます。"あなたは確かですか?(http://knockoutjs.com/documentation/json-data.html) – kamranicus

+0

ジョン - 私はデバッグし、console.logで配列をチェックし、データはクライアントに到達しています。どちらの配列もエラーなしの同じ構文です。 –

答えて

0

あなたのブラウザのログを表示すると、あなたの問題(特にポストとレスポンス)についてもっと詳しく言うことができます。私はあなたにajaxでデータをロードし、テンプレートをバインドし、それらを操作で操作して保存する方法を示す簡単な例を用意しました。これはあなたの問題を解決するのに役立ちます

希望:http://jsfiddle.net/gurkavcu/KbrHX/

概要:

// This is our item model 
function Item(id, name) { 
    this.id = ko.observable(id); 
    this.name = ko.observable(name); 
} 

// Initial Data . This will send to server and echo back us again 
var data = [new Item(1, 'One'), 
      new Item(2, 'Two'), 
      new Item(3, 'Three'), 
      new Item(4, 'Four'), 
      new Item(5, 'Five')] 

// This is a sub model. You can encapsulate your items in this and write actions in it 
var ListModel = function() {  

    var self = this;  
    this.items = ko.observableArray(); 
    this.remove = function(data, parent) { 
     self.items.remove(data); 
    }; 
    this.add = function() { 
     self.items.push(new Item(6, "Six")); 
    }; 
    this.test = function(data, e) { 
     console.log(data); 
     console.log(data.name()); 
    }; 
    this.save = function() {   
     console.log(ko.mapping.toJSON(self.items)); 
    }; 
} 

// Here our viewModel only contains an empty listModel 
function ViewModel() { 
    this.listModel = new ListModel(); 
}; 

var viewModel = new ViewModel(); 

$(function() { 
    $.post("/echo/json/", { 
     // Data send to server and echo back 
     json: $.toJSON(ko.mapping.toJS(data)) 
    }, function(data) { 

    // Used mapping plugin to bind server result into listModel 
    // I suspect that your server result may contain JSON string then 
    // just change your code into this 
    // viewModel.listModel.items = ko.mapping.fromJSON(data); 

    viewModel.listModel.items = ko.mapping.fromJS(data); 

    ko.applyBindings(viewModel); 
}); 
}) 
7

はあなたの "WIWeb.asmx/GetTemplates" を確認して正確な構造{WINameでオブジェクトのJSON配列を返します。 ' 」、WIDescription: 『』} この

function wiTemplateInit(winame, description) 
    { 
     var self = this; 
     self.WIName = winame; 
     self.WIDescription = description; 
    } 

    function ViewModel() 
    { 
     var self = this; 
     self.wiTemplates = ko.observableArray(); 

     $.ajax({ 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      data: "{UserKey: '10'}", 
      url: "WIWeb.asmx/GetTemplates", 
      success: function (data) 
      { 
       var mappedTemplates = $.map(allData, function (item) { return new wiTemplateInit(item.WiName, item.Description) }); 
       self.wiTemplates(mappedTemplates); 

      } 
     }); 
    } 

    var vm = new ViewModel(); 

    ko.applyBindings(vm); 
+0

これは、複数の$ .ajax旅行で同じビューモデルで実行することができますか?つまり、2つの自己があったとします。別々に検索しなければならない変数。 – Nikos

+1

私は実際のアイテムモデルの必要性をスワップし、$ .map内の各アイテムに対して 'return ko.mapping.fromJS(item)'を使用しました。どのような動的な感じを与える – Jeremy

+0

多くの多くのおかげで、最終的にブレークスルーを行った:-) –

関連する問題