3

这是js:

var view = function(){
    self.arry = ko.observable();

    self.arry(ko.mapping.fromJS([{prop:'Test'},{prop:'Test'}]));

    console.log(self.arry().length);       
}
var v = new view();

可观察的数组长度始终为零。如何获得正确的长度?

编辑:
更新了 JS 并修复了错误。 http://jsfiddle.net/eRHTv/

var view = function(){
  var self = this;
  self.arry = ko.observableArray();

  self.load_items = function(){
    setTimeout(function(){
    self.arry(ko.mapping.fromJS([{prop:'Test'},{prop:'Test'}]));
    }, 100);
  }
  self.no_items_visible = ko.computed(function(){
     return (self.arry().length == 0);
  });

  self.load_items();


  ko.applyBindings(self);
}

var v = new view();

当您运行此程序时,不会始终显示任何项目 div,如果您执行 self.arry = data,则视图将不会更新。

4

2 回答 2

4

第一件事是:你永远不会定义变量self

var self = this;

第二:如果输入是一个数组,ko.mapping.fromJS() 返回一个可观察的数组:

self.arry = ko.mapping.fromJS(...);

总共:

var view = function() {
    var self = this;

    self.arry = ko.mapping.fromJS([ {prop:'Test1'}, {prop:'Test1'} ]);

    console.log(self.arry().length);
}

var v = new view();
于 2012-04-15T14:49:53.870 回答
3

这篇文章解释了为什么可观察数组的长度总是等于 0。实际上,可观察数组(由 ko.observableArray(...) 返回)是一个函数。任何函数都有长度属性。

更多在这里:

https://github.com/knockout/knockout/issues/4

因此,您应该始终使用:myObservableArray().length 而不是 myObservableArray.length。

于 2015-12-10T20:55:02.063 回答