【问题标题】:ko.Observable array contains data but it's length property has value as 0ko.Observable 数组包含数据,但它的长度属性值为 0
【发布时间】:2013-07-15 11:56:32
【问题描述】:

我有一个 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()); -- 不返回任何内容

请帮忙。

【问题讨论】:

  • 您的代码应该可以工作。获取数据后,您的警报究竟何时在$.getJSON 回调中执行?你可以在 JSFIddle 中创建一个报告吗?
  • 您确定要调用alert getJSON 返回数据之后?
  • 我不确定如何在 Fiddle 中模拟服务器调用..
  • function (data)function (data) { ?? function (data) { 呢??
  • 你在哪里调用 alert(self.AllItems().length); ?由于 getJSON 异步工作,因此您必须在回调函数中调用它。

标签: knockout.js ko.observablearray


【解决方案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());
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-05
    • 2018-12-10
    • 2023-03-06
    • 2019-07-19
    • 2020-08-27
    • 2018-12-02
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多