knockout.js`foreach`控件绑定中的粒度渲染控件

时间:2015-03-30 18:42:26

标签: 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: {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>
...

在使用class="feedgraph"的最后一个DIV中,我添加了(在这种情况下)D3图表,当DIV在foreach之外时,它可以正常工作。但是,每次JSON轮询返回时,敲门都会重新呈现整个TR,无论JSON是否包含更改的值,我的.feedgraph div都会被清空。

相关的viewmodel块:

...
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();
});
...

在我看来,只有当绑定值发生变化时,淘汰渲染才应该发生在原子TD级别,而不是像它看起来那样处于TR级别。

因此,我的问题是:有没有办法让淘汰赛不再重新呈现foreach中的整行,而只是重新渲染具有数据绑定属性的TD单元格而不留下我的D3图表?

0 个答案:

没有答案