Knockout:链接可观察数组

时间:2014-09-04 16:25:04

标签: knockout.js ko.observablearray

在一个带有生成器的函数中,可能是普通的JS数组或ko.observableArray,如何以最小的开销使用observableArray

这是代码目前的样子:

function (itemGenerator) { // returns observableArray or JS array
  var allItems = ko.observable();

  // triggered after user interaction
  var itemsFromGenerator = itemGenerator();
  if (ko.isObservable(itemsFromGenerator)) {
    allItems(itemsFromGenerator());

    itemsFromGenerator.subscribe(newValue => {
      allItems(newValue)
    });
  } else {
    allItems(children);
  }
}

如果allItemsobservableArray,是否可以用itemsFromGenerator替换observableArray?因此,我不必订阅进一步的更改"手动"并且必须复制周围的数据。

(这在TreeView实现中使用,我只想在展开节点时生成items数组。)

2 个答案:

答案 0 :(得分:1)

只有allItems包含可观察数组,然后你有外部observable来跟踪替换可观察数组的时间。不需要订阅。

function (itemGenerator) { // returns observableArray or JS array
  var allItems = ko.observable();

  // triggered after user interaction
  var itemsFromGenerator = itemGenerator();
  if (ko.isObservable(itemsFromGenerator)) {
    allItems(itemsFromGenerator);
  } else {
    allItems(ko.observableArray(itemsFromGenerator));
  }
}

此答案基于您提供的信息。我仍然不知道为什么你需要保持对itemsFromGenerator的引用,除非它在某种程度上在这个函数之外独立引用。我也不知道实际调用// triggered after user interaction下的代码的时间。最后,我不知道阵列中这些项目的使用位置和方式。

答案 1 :(得分:1)

如果我做得对,你可以使用ko.utils.unwrapObservable()(见好explanation):

  

如果您不知道自己是否获得了可观察量,则应使用ko.utils.unwrapObservable。

代码应该是这样的:

function ViewModel(itemGenerator) {
    var self = this;
    this.itemsFromGenerator = ko.observableArray();
    this.generate = function() {
        self.itemsFromGenerator(ko.utils.unwrapObservable(itemGenerator()));                                       
    };
}

generate是您运行项目生成器的触发器。请参阅demo。在generator函数中,您可以在普通数组和可观察数组之间切换。