0

我有一个模型类,它附加了一些函数(方法)。当我查看函数之外的可观察数组的长度时,长度会正确返回。但是当我查看模型类的函数内的 observablearray 时,它总是返回 0。但是如果我通过函数内的索引访问 observablearray 内的项目,它会返回正确的项目。为什么长度总是0?

    function ModelView(data) {
      var self = this;


      self.items= ko.observableArray(data.items);
      var test = self.items().length; //shows correct number
      self.EditRule = function (product) {
        for(var i=0; i<self.items().length; i++)
              //dosuff but self.items().length is always 0


      }
    }

我通过在视图模型中添加一个附加属性找到了解决方法,如下所示:

     self.itemslength = ko.observable(self.items().length);

显然我的实际问题要复杂得多,但循环正在将项目与传入的参数进行比较,以确保某些东西是有效的。self.items 基本上是一个主列表。

4

1 回答 1

1

尝试使用ko.utils.arrayForEach迭代你的 observableArray:

function ModelView(data) {
      var self = this;
      self.items = ko.observableArray(data.items);
      var test = self.items().length; //shows correct number
      self.EditRule = function () {
          ko.utils.arrayForEach(self.items(), function(item){
              if (item.name === "2"){
                  // For example
                  console.log(self.items().length); //will be 3
                  self.items.remove(item);
                  console.log(self.items().length); //will be 2
              }
          });
      }
 }

var myData = {
    items : [{id: 0, name: "0"},{ id: 1, name: "1"}, {id: 2, name: "2"}]
}

var myModelView = new ModelView(myData);
ko.applyBindings(myModelView);

我用这个 html 测试过:

<ul data-bind="foreach: items">
    <li data-bind="text: name"></li>
</ul>
<a href="#" data-bind="click: EditRule">EditRule</a>

如果您愿意,您也可以使用 vanilla for 循环:它与您自己的尝试非常相似,但您可能在其他地方有错误。

function ModelView(data) {
      var self = this;
      self.items = ko.observableArray(data.items);
      var test = self.items().length; //shows correct number
      self.EditRule = function () {
          for(var i =0; i < self.items().length; i++){
              if (self.items()[i].name === "2"){
                  // For example
                  console.log(self.items().length); //will be 3
                  self.items.remove(self.items()[i]);
                  console.log(self.items().length); //will be 2
              }
          }
      }
 }
于 2013-10-07T17:04:51.023 回答