【问题标题】:Meteor {{#each}} loop not working流星 {{#each}} 循环不起作用
【发布时间】:2016-07-31 08:24:40
【问题描述】:

在我的 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 循环没有显示从帮助程序返回的任何消息文本?消息数组中的文本也不会打印到控制台。会话变量“chatId”确实被设置了。所以我的方法似乎正在工作并在“res”中返回整个对象。有什么指点吗?

【问题讨论】:

  • 方法是服务器端还是客户端?可以贴一下方法代码吗?

标签: meteor each


【解决方案1】:

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

【讨论】:

  • 该方法在服务器端运行。所以回调函数确实有效,我得到了一个 chatId。
【解决方案2】:

您对服务器的流星方法调用是异步的,这意味着回调函数将在稍后运行,因此您可以使用会话变量来像这样更新 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) : [];
     }
});

【讨论】:

  • 谢谢!使用这条路线,我得到一个错误 - “未捕获的错误:{{#each}} 当前只接受数组、游标或错误值。”这很有趣,因为 res.messages 应该是一个数组...
  • @achatter 抱歉,我在最后一行有错误。我使用Session.set 而不是Session.get。我现在正在纠正它。
【解决方案3】:

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

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

  2. 您还可以使用 simple:reactive-method 包来完成大部分工作。 欲了解更多信息,请访问here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 2014-06-12
    • 2012-11-05
    • 2017-01-14
    • 2015-04-06
    • 2013-03-06
    • 1970-01-01
    相关资源
    最近更新 更多