Knockout.js KnockoutJS映射更新无法正确使用<--ko foreach:——>;样式装订

Knockout.js KnockoutJS映射更新无法正确使用<--ko foreach:——>;样式装订,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,我有一个KnockoutJS模板,看起来像这样: <div data-bind="template: {name: 'testTemplate', data: people}"></div> <script id="testTemplate" type="text/html"> <!--ko foreach: $data--> <div class="items" data-bind="text: full(

我有一个KnockoutJS模板,看起来像这样:

<div data-bind="template: {name: 'testTemplate', data: people}"></div>

<script id="testTemplate" type="text/html">
    <!--ko foreach: $data-->        
    <div class="items" data-bind="text: full() + ' updated at: ' + Date()"></div>
    <!--/ko-->
</script>

在运行了n次测试之后,我意识到创建这样的模板是有缺陷的,因为KnockoutJS每次都会更新模板,即使数据没有改变

我用这两个小提琴来说明这一点:

  • (工作正常)
  • (失败得可怕)
如您所见,如果在foreach绑定上点击load initial或load updated data按钮,则除非数据发生实际更改,否则UI永远不会重新呈现。不幸的是,如果对数据样式绑定执行相同的操作,则每次都会呈现它

我真的搞不懂有什么区别。我的印象是,数据绑定的工作方式与foreach相同,但允许对模板内的对象进行更多控制

我使用它的唯一原因是因为我有一组嵌套的模板,我需要更接近手头的实际对象。我应该能够重新考虑,并摆脱这种方法,但我仍然想知道为什么这是一个问题


不应该遵循foreach模板绑定使用的相同模式吗?

问题是,模板绑定创建了对
人员的订阅,因为它作为
数据传递。更新
人员
数组(推送/删除项目等)时,将触发模板绑定以重新呈现模板。在您的例子中,这会重新呈现所有内容,因此模板内部的
foreach
永远不会有效率

避免这种情况的一个简单方法是确保模板绑定不会打开您的
人员
可观察页面。您可以像
{myArray:people}
那样传递数据,然后在
myArray
上执行
foreach


以下是一个示例:

您现在意识到我只是想提出一个您无法回答的问题:)。哈哈…很好的解决方案!我注意到,如果
是模板绑定的包装,那么
也会发生同样的情况,因此,是的,行为会类似。