【发布时间】:2023-03-14 09:20:01
【问题描述】:
好的,标题可能有点混乱,所以我会解释...
我正在编写一个自定义绑定,我将向其传递一个 observableArray。这个 observableArray 是异步填充的,元素一个一个推入。
问题是每次 observableArray 发生突变时都会调用我的自定义绑定(update 方法)。这是有道理的,但在这种情况下没有帮助,因为这意味着第一个元素被渲染 n 次,其中 n 是 observableArray 的长度,第二个元素被渲染 n-1 次,只有 nth 元素被渲染一次。
谁能解释一个简洁的方法,让自定义绑定只在两种情况下都做某事
- observableArray 已完全填充,或者
- 何时添加了自定义绑定尚未呈现的元素?
我可以想出几种方法来解决这个问题,在父视图模型上使用一个额外的属性/可观察的作为一个标志,上面写着“完全填充,你现在可以渲染项目”或每个元素上的属性说“你已经渲染了我”。然而,这些都很尴尬,尤其是 observableArray 中的对象也有 observableArray 属性。
对于这个问题没有更好的 Knockout/MVVM 解决方案吗?
更新:为了清楚起见,我正在构建的基础是这样的
<domElmnt data-bind="myBinding: { collection: TypeGroups }" />
在哪里
TypeGroups = ko.observableArray();
其中TypeGroups 中包含的元素都是另一个具有可观察属性的视图模型的实例。
每次我调用 TypeGroups.push(obj) 时,都会再次调用自定义绑定。
【问题讨论】:
-
observableArray 不应重新渲染未更改的元素。尝试添加一个显示
new Date()的绑定来检查它是否真的重新渲染了东西。类似<span data-bind="text: new Date()"></span> -
自定义绑定是在observableArray还是items上?
-
observableArray 没有重新渲染;发生的事情是,每次 observableArray 发生突变时,它都会调用自定义绑定,然后循环遍历 observableArray 中的所有项目——即使是那些已经处理过的项目。
-
您是否有不能使用
foreach绑定的原因? -
@Michael - 是的:因为一旦进入循环,在任何其他标记之前,就是另一个循环,并且 IE8/9 剥离了这个嵌套循环所需的无容器绑定。在我们发现 IE9 损坏之前,我们确实有一个
foreach,这就是我转向自定义绑定的原因。
标签: javascript knockout.js ko.observablearray custom-binding