2012-11-20 81 views
2

我想在我的JSON文件中加載,然後爲每個項目插入。使用jQuery插入到可觀察數組中的好方法

所以我有這樣的代碼

function ProductType(id, name) { 
var self = this; 

self.id = id; 
self.name = name; 
} 


function ProductsViewModel() { 
    var self = this; 
    var jqxhr = $.getJSON("data/product.json").success(function(data, status, xhr) { 
      self.products = ko.observableArray([  
     $.each(data.data.productTypeList, function(i,item){ 
      new ProductType(i, item.longName); 
    }) 
]);    
     }) 
    .error(function() { alert("error"); }) 
    .complete(function() { 
     console.log("fetch complete + " + this); 
    }); 

} 

我不知道如何最好的做法是在當前時間我得到這個錯誤

錯誤插入的可觀察陣列從每個功能

:500錯誤get/knockoutJQMProducts /#products無法解析綁定。 消息:ReferenceError:產品未定義; 綁定值:foreach:產品

但如果我console.log(i)在每個語句內返回結果。

感謝

回答

3

ryadavilli的回答是不錯的,但可以通過緩存陣列,然後一次性全部設置observableArray得到改善。

function ProductsViewModel() { 
    var self = this; 
    self.products = ko.observableArray(); 
    var jqxhr = $.getJSON("data/product.json").success(function(data, status, xhr) { 
     var products = []; 
     $.each(data.data.productTypeList, function(i, item) { 
      products.push(new ProductType(i, item.longName)); 
     }); 
     self.products(products); 
    }) 
     .error(function() { 
      alert("error"); 
     }) 
     .complete(function() { 
      console.log("fetch complete + " + this); 
     }); 
} 
+0

好點。這確實減少了陣列變化時敲除發送的通知的數量。 – ryadavilli

2

我已經修改了你的虛擬機,併成功方法,從而可觀察到的陣列填充成功。但它始終存在。

function ProductsViewModel() { 
    var self = this; 
    self.products = ko.observableArray();  
    var jqxhr = $.getJSON("data/product.json").success(function(data, status, xhr) { 
     // use this remove all only if you want to clear and load with new data. 
     self.products.removeAll(); 
     $.each(data.data.productTypeList, function(i,item){ 
      self.products.push(new ProductType(i, item.longName)); 
    }) 
    }) 
.error(function() { alert("error"); }) 
.complete(function() { 
    console.log("fetch complete + " + this); 
}); 
} 
+0

感謝您的回答..現在發生一個奇怪的事情是,我的jQuery Mobile的造型犯規發生的地方,因爲它沒有當我只用這些物品 \t self.products = ko.observableArray([ \t \t \t新ProductType( '1', '丹'), \t \t \t新ProductType( '2', 'S') \t \t \t]); 有什麼想法爲什麼? – Dan

+0

你能分享你的HTML綁定代碼嗎?另外,請檢查成功調用中創建的對象嗎?是否有可能你或我錯過了一些財產。另外,我看到數組中的對象(每個ProductType)都具有作爲字符串的所有屬性。這與你的ajax數據一樣嗎?如果不是,您可能需要更改綁定或ProductType返回值中的屬性以反映此情況。 – ryadavilli

+0

這裏是網址 http://demo.stg.brightonconsulting.net.au/templates/tests/knockoutJQMProducts/ 請注意,當你第一次通過這個它確定,但如果你刷新產品頁面它失去了stying ..如果我嘗試在我的手機上的第二頁數據甚至不出現! – Dan

相關問題