我创造了一个小游戏,我希望在一个玩家等待某个动作时显示对手的名字。为了显示我的对手名字,我有以下功能。
Template.Details.helpers({
opponentName: function() {
var opponentId = _.without(this.players, Meteor.userId)[0];
var oppDoc = Meteor.users.findOne({_id: opponentId});
return oppDoc;
})
在我的模板中
<template name='opponent'>
<h3> {{opponentName.username}} </h3>
</template>
这将首次返回正确的用户名。但是,此后用户名不会更改。我认为这是因为我的var opponentId不会改变。
我在想一种让这种反应的方法。因此,当reactieve数据源(Meteor.userId)更改函数时,opponentId将重新运行并返回一个新的userId。
执行此操作的正确方法是什么,我是否仍然在模板助手中执行此操作?
编辑:
我也尝试了以下内容:
Template.Details.helpers({
opponentName: function() {
var id = Games.findOne({_id: this._id}, {isCreating: 1})
var opponentId = _.without(this.players, id)[0];
var oppDoc = Meteor.users.findOne({_id: opponentId});
return oppDoc;
})
我的想法是,因为isCreating正在更新id是被动的,因此会更新所有内容。但这也不起作用。
答案 0 :(得分:1)
Meteor.userId()
作为函数调用,以便正确注册反应式依赖项。所以只需在末尾添加这些括号,你应该全部设置。
可能导致问题的另一件事是this.players
的价值。当对手改变时,这会被反应更新吗?