2014-02-19 127 views
0

試圖從服務器加載使用JSON的observableArray這樣的:負載淘汰賽observableArray不工作

function InsightViewModel() { 
    var self = this; 
    self.Name = ko.observable(""); 

    var insightData = { 
     Name: self.Name 
    }; 

    self.insightData = ko.observable(); 
    self.Insights = ko.observableArray([]); 

    $.ajax({ 
     type: "GET", 
     url: '@Url.Action("GetIndexData", "Admin")', 
     contentType: "application/json", 
     dataType: "json", 
     data:{}, 
     success: function (data) { 
      self.Insights(data); 
      alert(JSON.stringify(data) + "Array length " + self.Insights.length); 
     }, 
     error: function (error) { 
      alert(error.status + " " + error.statusText); 
     } 
    }); 
}; 

var viewModel = new InsightViewModel(); 
ko.applyBindings(viewModel); 
alert(viewModel.Insights.length); 

我可以提醒了從服務器的JSON,它是有效的。但數組是空的。

我想這一點,沒有運氣:

$(data).each(function (element) { 
    self.Insights.push(element); 
}); 

不與淘汰賽經驗。有什麼想法嗎?

+0

'警報(viewModel.Insights.length);你的'$ .ajax.sucess之前'可能運行調用回調函數。如果您嘗試'ko.dataFor(document.body).Insights()。length',會怎麼樣? – haim770

+3

您錯誤地獲得長度'Insights'數組,它應該是'self.Insights()。length'(帶括號)。 – alexmac

+0

你是對的亞歷山大,我的壞... – Soeren

回答

1

你被錯誤地獲取長度Insights observableArray,它應該是這樣的:

self.Insights().length // with brackets 

另一個問題,如所描述@ haim770呼籲ko.applyBindings(viewModel)alert。 ajax請求尚未完成的可能性很大。

0

數組爲空的原因是因爲默認情況下ajax是異步的。解決方法是在你的ajax調用中添加async:false,但這不是最好的實踐。取而代之的將異步:假使用.done ...

function InsightViewModel() { 
    var self = this; 
    self.Name = ko.observable(""); 

    var insightData = { 
     Name: self.Name 
    }; 

    self.insightData = ko.observable(); 
    self.Insights = ko.observableArray([]); 

    $.ajax({ 
     type: "GET", 
     url: '@Url.Action("GetIndexData", "Admin")', 
     contentType: "application/json", 
     dataType: "json"    
    }) 
    .done(function(data) 
    { 
     self.Insights(data); 
    }); 
}; 

var viewModel = new InsightViewModel(); 
ko.applyBindings(viewModel); 
alert(viewModel.Insights.length()); 

希望這項工作...