javascript - knockout : a custom binding for observableArray which renders only when complete

标签 javascript knockout.js ko.observablearray custom-binding

好吧,标题可能有点困惑,所以我会解释......

我正在编写一个自定义绑定(bind),我将向其传递一个 observableArray。这个 observableArray 是异步填充的,元素被一个一个地插入。

问题是每次 observableArray 发生变化时我的自定义绑定(bind)都会被调用(update 方法)。这是有道理的,但在这种情况下没有帮助,因为这意味着第一个元素被渲染 n 次,其中 n 是 observableArray 的长度,第二个元素被渲染 n-1 次,只有 nth 元素被渲染一次。

谁能解释一种让自定义绑定(bind)只在任何时候做某事的简洁方法

  • observableArray 已完全填充,或者
  • 添加了自定义绑定(bind)尚未呈现的元素时?

我可以想出几种解决方法,使用附加属性/可观察对象作为父 View 模型上的标志,表示“完全填充,您现在可以呈现项目”或每个元素上的属性说“你已经渲染了我”。然而,这些都很尴尬,特别是因为 observableArray 中的对象也有一个 observableArray 属性。

没有更好的 Knockout/MVVM 解决方案来解决这个问题吗?

更新:为了清楚起见,我在上面构建的是这样的

<domElmnt data-bind="myBinding: { collection: TypeGroups }" />

在哪里

TypeGroups = ko.observableArray();

TypeGroups 中包含的元素都是另一个具有可观察属性的 View 模型的实例。

每次我调用 TypeGroups.push(obj) 时,自定义绑定(bind)都会被再次调用。

最佳答案

无法准确判断是否有必要,但如果必须将 customBinding 放在 observableArray 上,我会这样做。

您想做的是原子更新。和通常的数组拼接一样,有splice方法。

yourArray.splice(atIndex, 0, elem1, elem2, elem3 ...)

但像那样它并不是真正有用:

yourArray.splice.apply(yourArray, [index, 0, elem1, elem2, elem3 ...])

它不是那么漂亮,但我们可以做得更好。

function append(array, values) {
    var params = [array().length, 0];
    params.push.apply(params, values);
    array.splice.apply(array, params);
}

我很确定使用 splice 将自动附加所有元素,而无需多次调用更新。另一方面,调用 array.push.apply(array, values) 可能就足够了,不需要拼接。

但是!

如果我处于您的位置,我会将绑定(bind)从 obserableArray 移动到可观察数组内的项目。我不知道你为什么在更新后迭代所有项目。如果元素被处理一次,是否有任何理由多次处理已处理的项目?如果不是,那么自定义绑定(bind)可能不会在应该使用的地方使用。

在不了解您的问题的更多信息的情况下,很难说什么是处理您的问题的最佳方法。

关于javascript - knockout : a custom binding for observableArray which renders only when complete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21166164/

相关文章:

javascript - 在 Javascript 中打破递归函数并返回一个值

javascript - 在 ASP.NET WebForms 服务器端帖子之间持续 knockout ViewModel ...

javascript - 计算的可观察量不会收到更改通知

javascript - 异步 knockout observableArray 选择选项加载

javascript - 以表格形式返回 HTML 元素

javascript - 状态不会使用 Axios 使用 useEffect 更新

javascript - 在 Google App 脚本中请求 API 数据时,有没有办法使用特定的 IP?

javascript - 将单例与模型一起使用的缺点

knockout.js 如何初始化tinymce?

javascript - knockout : How can I pass a single item from an observable array into my viewmodel?