单击发送按钮时,我不断收到此错误消息。我试图创建一个Instant Messenger应用程序,在线用户可以一对一聊天。我是初学者,我真的很感激任何帮助。这是我的错误消息,一旦我单击“发送”按钮,它就会出现在控制台中。
Tracker重新计算功能的异常:meteor.js:862错误: {{#each}}目前只接受数组,游标或falsey值。 在badSequenceError(observe-sequence.js:148) at observe-sequence.js:113 at Object.Tracker.nonreactive(tracker.js:597) at observe-sequence.js:90 在Tracker.Computation._compute(tracker.js:331) 在Tracker.Computation._recompute(tracker.js:350) at Object.Tracker._runFlush(tracker.js:489) at onGlobalMessage(meteor.js:347)
这是我的HTML
<template name="chat_page">
<h2>Type in the box below to send a message!</h2>
<div class="row">
<div class="col-md-12">
<div class="well well-lg">
{{#each messages}}
{{> chat_message}}
{{/each}}
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<form class="js-send-chat">
<input class="input" type="text" name="chat" placeholder="type a message here...">
<input type="submit" value="Send">
</form>
</div>
</div>
</template>
<!-- simple template that displays a message -->
<template name="chat_message">
<div class = "container">
<div class = "row">
<img src="/{{profile.avatar}}" class="avatar_img">
{{username}} said: {{text}}
</div>
</div>
<br>
</template>
客户端
Template.chat_page.helpers({
messages: function () {
var chat = Chats.findOne({ _id: Session.get("chatId") });
return chat.messages;
},
other_user: function () {
return "";
}
});
Template.chat_page.events({
'submit .js-send-chat': function (event) {
console.log(event);
event.preventDefault();
var chat = Chats.findOne({ _id: Session.get("chatId") });
if (chat) {
var msgs = chat.messages;
if (! msgs) {
msgs = [];
}
msgs.push({ text: event.target.chat.value });
event.target.chat.value = "";
chat.messages = msgs;
Chats.update({ _id: chat._id }, { $set : { messages: chat } });
Meteor.call("sendMessage", chat);
}
}
});
服务器端的部分
Meteor.publish("chats", function () {
return Chats.find();
});
Meteor.publish("userStatus", function () {
return Meteor.users.find({ "status.online": true });
});
Meteor.publish("userData", function () {
if (this.userId) {
return Meteor.users.find({ _id: this.userId },{ fields: { 'other': 1, 'things': 1 } });
} else {
this.ready();
}
return Meteor.users.find({ "status.online": true });
});
Meteor.publish("users", function () {
return Meteor.users.find({ "status.online": true });
});
Chats.allow({
insert: function () { return true; },
update: function () { return true; },
remove: function () { return true; }
});
Meteor.methods({
sendMessage: function (chat) {
Chats.insert({
chat: chat,
createdAt: new Date(),
username: Meteor.user().profile.username,
avatar: Meteor.user().profile.avatar,
});
}
});
答案 0 :(得分:0)
您订阅的机会尚未准备就绪。这意味着Chats.findOne()
将不返回任何内容,这意味着Chats.findOne().messages
将是未定义的。
尝试以下方法:
{{ #if Template.subscriptionsReady }}
{{#each messages}}
{{/each}}
{{/else}}
或者,在聊天中使用find()
,然后在聊天中的消息上使用{{#each}}
。例如:
Template['Chat'].helpers({
chats: function () {
return Chats.find(Session.get('chatId')); // _id is unique, so this should only ever have one result.
}
});
然后在模板中:
{{#each chats}}
{{#each messages}}
{{>chat_message}}
{{/each}}
{{/each}}
答案 1 :(得分:0)
我认为此行可能存在逻辑错误
Chats.update({ _id : chat._id }, { $set : { messages : chat } });
您要将字段messages
的值设置为chat
。但是chat
是一个对象。因此,当您将Chats.findOne().messages
返回到{{#each}}
块时,在您的帮助器中,您实际上返回的对象不是一个有效值,而是要发送到{{#each}}
块,因此会出错。
我认为你的意思是
Chats.update({ _id : chat._id }, { $set : { messages : msgs } });