会话更改时未调用Meteor助手

时间:2015-05-08 01:50:46

标签: meteor

以下在页面加载时调用消息,但在更改会话值时调用消息。这是模板代码;

<head>
  <title>Your welcome to chat</title>
</head>

<body>
    {{> chat}}
</body>

<template name="chat">
    <div class="ui list" style='height: 100px; overflow:scroll;' id='chatHistory'>
        {{> currentChatList}}
    </div>
    <div class="ui large icon input">
        <input type="text" class="field" id="message" placeholder="Type your message here" />
        <i class="comment icon"></i>
    </div>
</template>

<template name="currentChatList">
    {{#each messages}}
    {{/each}}
</template>

这是代码;

if (Meteor.isClient) {
    Template.chat.events ({
        'keydown input#message' : function (event) {
            if (event.which == 13) { // 13 is the enter key event
                Session.set('time', new Date());
            }
        }
    });
    Template.currentChatList.helpers({
        messages : function () {
            debugger;
            return [];
        }
    });
}

调试器语句在页面加载时被点击,但是当在文本框上按下回车键并且执行了Session.set(&#39; time&#39; ..)时没有。我认为会话值更改会导致模板呈现。

3 个答案:

答案 0 :(得分:3)

saimeunt's answer会解决您的问题。您的帮助者此刻不会访问任何反应变量(会话或收集),这意味着它永远不会再次执行。

最近越来越多的人喜欢使用reactive-var

  • 您的想法是在JS文件中声明一个反应变量,然后在您的帮助器中使用该反应变量。每次更改变量时,都会重新执行使用此变量的所有帮助程序。

答案 1 :(得分:1)

您不依赖于您在代码中的任何位置分配的Session变量。诸如模板助手之类的反应性计算仅在其一个依赖的被动数据源被修改时才重新运行,这在您的示例中显然不是这样。

尝试依赖助手代码中的Session变量,以便在按Enter键时重新执行该变量。

Template.currentChatList.helpers({
  messages: function () {
    debugger;
    var time = Session.get("time");
    console.log("You pressed enter at",time);
    return [];
  }
});

答案 2 :(得分:0)

最终答案:天哪。

https://blog.meteor.com/the-meteor-chef-reactive-dict-reactive-vars-and-session-variables-971584515a27

我已经尝试过window.someVariableThatChanges = NOT WORKING

我尝试了Session.someVariableThatChanges = NOT WORKING

实际变量-完全可以正常工作。

区别在于您需要创建一个Template ON CREATED事件,然后在其中添加变量。只需在您的even中使用此变量即可更改值和您的辅助参考-它就像魔术一样工作,感觉非常好。