Meteor {{#each}}循环不起作用

时间:2016-04-10 07:51:57

标签: meteor each

在我的HTML文件中,我有一个像这样的#each循环:

{{#each messages}}
    {{> chat_message}}
{{/each}}

在我的帮助器类中,我正在调用一种从Chats集合中检索聊天消息的方法:

    Template.chat_page.helpers({
    messages:function(){
        if(!Meteor.user()){
                    alert("Please log in to chat with someone");
                    return;
        }
        else{   
            var chatId = Meteor.call("startChat",Session.get("otherUserId"),function(err,res){
            if(err){
                console.log("callback failed");
                return;
            }

                Session.set("chatId", res._id);
                var arrayLength = res.length;
                for (var i = 0; i < arrayLength; i++) {
                    console.log("Message "+ i +"is " + res.message[i].text);

                }
                return res.messages;
            });
          }
     }
});

我似乎无法弄清楚为什么#each循环没有显示帮助程序返回的任何消息文本?消息数组中的文本也不会打印到控制台。 Session变量&#34; chatId&#34;确实设置好了。所以我的方法似乎正在工作并将整个对象返回到&#34; res&#34;。有什么指针吗?

3 个答案:

答案 0 :(得分:0)

如果您的方法在服务器端运行,则它无法设置Session变量(仅限客户端)。如果该方法在客户端上运行,似乎它没有找到任何查询结果(您订阅了正在查询的集合吗?)。 如果该方法在服务器上运行,则chatId将立即在客户端上返回undefined。

答案 1 :(得分:0)

您的meteor方法调用服务器是异步的意思是回调函数将在以后运行,因此您可以使用会话变量来更新这样的UI

Template.chat_page.onCreated(function () {
    var template = this;
    template.autorun(function () {
        Session.setDefault("messages-" + Session.get("otherUserId"), []);
        if(!Meteor.user()){
            alert("Please log in to chat with someone");
            return;
        } else {   
            var chatId = Meteor.call("startChat", Session.get("otherUserId"),function(err,res){
            if(err){
                console.log("callback failed");
                return;
            }

                Session.set("chatId", res._id);
                var arrayLength = res.length;
                for (var i = 0; i < arrayLength; i++) {
                    console.log("Message "+ i +"is " + res.message[i].text);

                }
                Session.set("messages-" + Session.get("otherUserId"), res.messages);
            });
          }
    }); 
});

Template.chat_page.helpers({
    messages: function() {
        var otherUserId = Session.get("otherUserId");
        return otherUserId ? Session.get("messages-" + otherUserId) : [];
     }
});

答案 2 :(得分:0)

你不能直接返回帮助器中对html的方法响应,因为meteor方法异步调用它的方法。

  1. 您可以将响应保存在被动变量或会话中。如果您不希望全局响应,我更喜欢有效变量。

  2. 您还可以使用simple:reactive-method软件包来完成大部分工作。 有关详细信息,请访问here