KnockoutJS observableArray未初始化

时间:2013-10-16 21:51:43

标签: javascript knockout.js

代码

function Product(name) {
  this.name = ko.observable(name);
}

function ProductViewModel() {
  var self = this;
  self.products = ko.observableArray();
  $.getJSON("/admin/test", function(allData) {
    var mappedProducts = $.map(allData, function(item) { return new Product(item.name) });
    self.products(mappedProducts);
    console.log(self.products);
  });    
}

ko.applyBindings(new ProductViewModel());

问题:正确设置allDatamappedProducts时(只是一系列带有名称和其他字段的产品),行console.log(self.products);正在打印一个空数组。

我真的很困惑,我最初接近KO,但这似乎是教程中的相同代码......我只是使用产品而不是任务。我确定我错过了一些愚蠢的东西。

2 个答案:

答案 0 :(得分:2)

您应该将事物记录在 observable中而不是observable本身:

console.log(self.products());

请参阅this fiddle,了解包含代码的演示。

在问题的情况下,它取决于浏览器将记录什么。当然, Chrome 有点令人困惑:

  

[]

好像是一个空数组。 Internet Explorer 10 更有意义,输出:

  

function c(){if(0<arguments.length)return c.equalityComparer&&c.equalityComparer(d,arguments[0])||(c.K(),d=arguments[0],c.J()),this;a.q.bb(c);return d}

那就是:self.products实际上是一个函数(一个可观察的)。 Firefox 介于两者之间,输出:

  

c()

没有IE10那么有用,但也不像Chrome那样令人困惑。

答案 1 :(得分:1)

这用于设置observable:

self.products(mappedProducts)

这是为了获得一个observbale或一个计算

的值
var mappedProducts = self.products();

注意括号。

我希望它有所帮助。