Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript knockout.js`foreach`控件绑定中的粒度呈现控件_Javascript_Knockout.js - Fatal编程技术网

Javascript knockout.js`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

我是个新手,在别处我似乎找不到这个问题的陈述或记录,尽管我怀疑我可能遗漏了什么

我的淘汰模板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: {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();
});
...