Javascript knockout.js`foreach`控件绑定中的粒度呈现控件
我是个新手,在别处我似乎找不到这个问题的陈述或记录,尽管我怀疑我可能遗漏了什么 我的淘汰模板HTML中有一个foreach:Javascript knockout.js`foreach`控件绑定中的粒度呈现控件,javascript,knockout.js,Javascript,Knockout.js,我是个新手,在别处我似乎找不到这个问题的陈述或记录,尽管我怀疑我可能遗漏了什么 我的淘汰模板HTML中有一个foreach: ... <tbody data-bind="foreach: cfeeds"> <tr class="datarow" data-bind="css:{danger:discovered()==false}"> <td><a title="View this feed" data-bind="text: name,attr
...
<tbody data-bind="foreach: cfeeds">
<tr class="datarow" data-bind="css:{danger:discovered()==false}">
<td><a title="View this feed" data-bind="text: name,attr: {href: view_url}"></a></td>
<td data-bind="text: description, css:{'text-danger':discovered()==false}"></td>
<td class="text-center" data-bind="text: sched_type"></td>
<td class="text-center" data-bind="text: sched_data"></td>
<td class="text-center" data-bind="text: moment(last_poll()).calendar()"></td>
<td class="text-right">
<div class="feedgraph">
<!-- D3 chart container -->
</div>
</td>
</tr>
</tbody>
...
在我看来,只有当绑定值发生变化时,敲除渲染才应该在原子TD级别上进行,而不是在TR级别上进行
因此,我的问题是:有没有一种方法可以防止knockout在foreach中对整行重新排序,而只对具有数据绑定属性的TD单元格重新排序,而不影响我的D3图表?knockout只会重新生成可观察数组中更改的对象。每次获得JSON时,您可能都在创建新对象。仅仅因为新对象包含与旧对象相同的数据,并不能使它们成为相同的对象。是否可以更新cfeeds中每个对象的属性,而不实际替换数组中的对象?当然,您可以像obj.myObsnewValue一样设置它们。您可以通过添加obj.myObsdata.extend{rateLimit:1000}每秒更新一次max.@CrimsonChris:听起来不错,但是您会注意到包含所讨论DIV的TD根本没有数据绑定属性。你是说如果cfeeds observable是一个不同的对象,foreach无论如何都会重新命名整行吗?我会调查并更新。@grav3nima3是的。foreach绑定的子项本质上是一个模板,它为cfeeds可观察数组的每个条目呈现一次。如果JSON更新机制丢弃现有的数组条目并用新条目替换它们,foreach将删除并重新添加模板。看一看,;它能够更新现有对象,并可能帮助您降低更新过程的侵入性。
...
self.cfeeds = ko.observableArray([]);
...
self.loadFeeds = function() {
postJSON(ajax_uri+'get_site_feeds/',{'site_id':selected_site_id},function(d){
self.cfeeds.removeAll();
$.each(d['configured_feeds'],function(i,v) {
self.cfeeds.push(new Feed(v));
});
setTimeout(vm.loadFeeds,5000);
});
};
...
$(function(){
vm.loadFeeds();
});
...