默认情况下,KO“将仅渲染新项目的模板,并将其插入现有DOM”。
有没有办法禁用此功能(例如,强制KO重新渲染所有项目)?
答案 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);
}
};
作为对您的查询的回答显然有点迟了,但可能会帮助其他人(例如我这样做)。