ko.Observable数组包含数据,但它的length属性值为0

时间:2013-07-04 08:44:51

标签: knockout.js ko.observablearray

我有一个ko.observablearray。我填充了从服务器获得的一些值:

self.AllItems = ko.observableArray([]);

$.getJSON('/Controller/GetItems', function (data) {
   for (var index = 0; index < data.length; index++) {
   self.AllItems.push(data[index]);
   }
 };
});

我知道这个工作得很好,因为我将数组绑定到列表并且包含所有项目。

<select multiple="multiple" size='4' data-bind="options:$root.AllItems, selectedOptions:$root.ItemsSelectValue"> </select>

但是,之后我无法访问AllItems的任何元素。 alert(self.AllItems().length); - 返回0

alert(self.AllItems()); - 不返回任何内容

请帮忙。

1 个答案:

答案 0 :(得分:1)

您可能尝试在(异步)jQuery Ajax调用完成之前警告AllItems的值。您可以使用jQuery XHR promises来解决这个问题,例如done承诺:

self.AllItems = ko.observableArray([]);

// Perform the XMLHttpRequest, and store the XHR object in a variable
var getItemsXHR = $.getJSON('/Controller/GetItems', function (data) {
  for (var index = 0; index < data.length; index++) {
    self.AllItems.push(data[index]);
  }
});

// Wait for the XMLHttpRequest to finish before reading AllItems
getItemsXHR.done(function(data, textStatus, jqXHR) {
  alert(self.AllItems().length);
  alert(self.AllItems());
});