在我的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;。有什么指针吗?
答案 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方法异步调用它的方法。
您可以将响应保存在被动变量或会话中。如果您不希望全局响应,我更喜欢有效变量。
您还可以使用simple:reactive-method软件包来完成大部分工作。 有关详细信息,请访问here