3

我正在做一个像这样的简单函数:

Game.msg = function(msg){
   var m = Session.get("messages") || [];
   m.push({"text": msg});
   Session.set("messages", m);
};

和一个模板:

Template.field.messages = function(){
   return Session.get("messages");
};

触发 Game.msg() 不会触发模板的自动更新。我怀疑这是因为数组引用没有改变[即使内容有]。触发更新的最佳方式是什么?

我的 hacky 解决方法是在 Game.msg 中设置一个虚拟计数变量 (var c = Session.get("message_count")) 并在 Template.field.messages 中引用,如下所示:

Game.msg = function(msg){
  var m = Session.get("messages") || [];
  m.push({"text": msg});

  // silly, but adding a count so the array size changes and triggers a flush
  Session.set("messages", m);
  Session.set("message_count", m.length);
};


Template.field.messages = function(){
    var c = Session.get("message_count");
    return Session.get("messages");
};
4

1 回答 1

5

使用 _.extend 创建一个像这样的新可变对象怎么样?

Game.msg = function(msg){
    var m = Session.get("messages");
    m = _.extend([], m);
    m.push({"text": msg});
    Session.set("messages", m);
};

我认为这比在 Session 中有一个新变量要清楚一些。

PS对不起,我没有足够的声誉来发表评论,所以我把它变成了一个答案。

于 2012-07-06T06:29:32.550 回答