如何更新数据表而不再渲染所有表?

时间:2013-04-12 09:02:59

标签: datatables meteor

我正在处理流星应用程序的数据表。 我的问题是当一些字段改变时,所有表再次呈现,如果我在表上的第二页或我按字段顺序,表再次呈现,我回到开头。 我的代码:

Template.adminpage.rendered = function() {
   $('#userData').dataTable({
        "bDestroy":true,
        "aaSorting": [[ 0, "desc" ]],
        "bAutoWidth":false,
        "bFilter": false,
        "aoColumns": [
            { "bVisible": false },
            null,
            null,
            null,
            null,
            null,
            null,
            null
        ],
        "aaData":  Template.adminpage.arrayUsersAdmin()
    });
}

填充表的数组:

Template.adminpage.arrayUsersAdmin=function() {
    var adminUsers = allUserData.find({roles: 'basic'});
    var arrayUserAdmin = [];
    var count=0;
    adminUsers.forEach(function(user) {
        var idColumn = user._id;
        var dateColumn=moment(user.createdAt).format("MMM Do HH:mm");
        var usernameColumn=username;
        var emailColumn=email;
        arrayUserAdmin[count]=[
            idColumn,
            dateColumn,
            usernameColumn,
            emailColumn
        ];
        count++;
    });
    return arrayUserAdmin;
}

服务器上的集合:

if(Meteor.users.find({_id: this.userId}, {roles: 'admin'})){
    Meteor.publish("allUserData", function () {
        var self = this;
        var handle = Meteor.users.find({}).observeChanges({
            added: function(id, fields){
                self.added("allUsersCollection", id, fields);
            },
            changed: function(id, fields){
                self.changed("allUsersCollection", id, fields);
            },
            removed: function(id){
                self.removed("allUsersCollection", id); 
            }
        });
        self.ready();
        this.onStop(function() {
            handle.stop();
        }); 
    }); 
}

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

您可以将reactive: false作为选项传递给find,这会禁用基础添加依赖项,如下所示:

Template.adminpage.arrayUsersAdmin=function() {
    var adminUsers = allUserData.find({roles: 'basic'}, reactive: false);
    // Your code
    return arrayUserAdmin;
}

此行为记录为here

或者,如果您希望更新各个字段,则必须自行添加。为此,您可以使用allUserDate.find({roles: 'basic'}).observe。但是,这将要求您直接编辑HTML,并且非常混乱。更好的选择是完全更改表结构 - 不要使用数据表,使用vanilla HTML表,并使用minimongo查询对数据进行排序。

无论如何,您可以像这样使用观察:

allUserData.find({roles: 'basic'}).observe({
    changed: function(newDocument, oldDocument) {
        // Update table
    }
});