Knockout.js模板Foreach - 强制完全重新渲染

时间:2011-09-22 14:38:52

标签: knockout.js jquery-templates

默认情况下,KO“将仅渲染新项目的模板,并将其插入现有DOM”。

有没有办法禁用此功能(例如,强制KO重新渲染所有项目)?

2 个答案:

答案 0 :(得分:7)

如果您使用jQuery.tmpl的原生{{each koObservableArray()}}语法Knockout无法更新单个项目但必须重新呈现整个模板

在此处查看更多内容:http://knockoutjs.com/documentation/template-binding.html

  

模板引擎的本机“每个”支持:在任何更改之后,   模板引擎被迫重新渲染所有内容,因为它不是   了解KO的依赖性跟踪机制。

如果您使用foreach模板模式,则只能获得“默认”行为,即:

<div data-bind='template: { name: "personTemplate", 
                            foreach: someObservableArrayOfPeople }'> </div>

答案 1 :(得分:7)

我今天遇到了类似的问题,并且能够通过自定义绑定替换模板来解决我的团队问题,该自定义绑定首先清除所有ko数据并在渲染之前清空容器。

http://jsfiddle.net/igmcdowell/b7XQL/6/

我使用了像这样的无容器模板:

  <ul data-bind="alwaysRerenderForEach: { name: 'itemTmpl', foreach: items }"></ul>

和自定义绑定alwaysRerenderForEach:

ko.bindingHandlers.alwaysRerenderForEach = {
  init: function(element, valueAccessor) {
    return ko.bindingHandlers.template.init(element, valueAccessor);
  },
  update: function(element, valueAccessor, allBindings, viewModel, context) {
    valueAccessor().foreach(); // touch the observable to register dependency
    ko.utils.domData.clear(element); // This will cause knockout to "forget" that it knew anything about the items involved in the binding.
    ko.utils.emptyDomNode(element); //Because knockout has no memory of this element, it won't know to clear out the old stuff.
    return ko.renderTemplateForEach(valueAccessor().name, valueAccessor().foreach, {}, element, context);
  }
};

作为对您的查询的回答显然有点迟了,但可能会帮助其他人(例如我这样做)。