【问题标题】:ko observablearray: Difference between push and assigning directlyko observablearray:推送和直接分配的区别
【发布时间】:2016-04-26 01:21:39
【问题描述】:

我有一个 observablearray 定义为:

model.permitList = ko.observableArray([]);

我正在使用一组对象对其进行初始化。当我这样做时会有所不同

  model.permitList (arrayOfObjects) 

对比

当我这样做时

  for(var i=0; i<arrayOfObjects.length; i++ ){
    model.permitList().push(arrayOfObjects(i));
  }

我知道这是有区别的,因为当我尝试使用

在我的视图中显示表格中的数据时
  <tbody data-bind="foreach: model.permitList">

只有第一种方法有效。

有人知道这两种方法的区别吗?提前非常感谢。

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    使用第二种方法,您将获得具有实际 Array 的值,而不是 ObservableArray

    for(var i=0; i<arrayOfObjects.length; i++ ){
      model.permitList.push(arrayOfObjects(i));
    }
    

    这将改变 observable 数组。

    当您执行model.permitList() 时,会返回一个带有每个值的本机Array 对象。当您对此调用 .push 时,它会修改该数组。 model.permitList 然而是一个 Knockout 对象。

    【讨论】:

      【解决方案2】:

      当你写model.permitList() 时,它就像执行一个getter 函数来获取值。在您的情况下,返回的值是一个本机数组,您在其上 .push 您的值。这将产生一个原生数组而不是 observableArray。要使剔除视图绑定起作用并且值更改以反映您需要observableArray,这只能在您使用像设置器这样的变量作为model.permitList (arrayOfObjects) 时完成。

      【讨论】:

      • 谢谢,您的解释帮助我消除了大部分困惑。
      猜你喜欢
      • 2016-07-10
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 2014-10-15
      • 2019-02-28
      相关资源
      最近更新 更多