为什么模板不能实时更新?

时间:2015-12-09 01:08:04

标签: javascript meteor real-time

我有这个意味着的Meteor代码,可以实时更新通知模板,只要触发了相应的操作:

〜/服务器/ app.js

Meteor.methods({
    notifs: function(){
        return Meteor.users.findOne({_id:this.userId}, {'profile.notifs': 1});
    }
});

和:

〜/客户端/ apps.js

Template.notifs.helpers({
  notifs: function(){
    Meteor.call('notifs', function(err, data){
      Session.set('notifs', data);
    });
    return Session.get('notifs');
  }
});

最后:

〜/ public / templates / notifs.html

<template name='notifs'>
    {{#each notifs}}
        <p>...</p>
    {{/each}}
</template>

此代码 目前只是在用户登录时列出通知,无法实时更新,以便在触发操作时显示新通知。 新通知仅在页面刷新后显示(实际上,这是无用的)。

经过几个小时的谷歌搜索,我放弃并发布此处,以便有人可以帮助我。

提前致谢。

1 个答案:

答案 0 :(得分:0)

在它的核心,这个问题是关于reactivity。由于Meteor.call不是一个被动数据源(它只是一个远程过程调用),如果底层数据发生变化,帮助者将不会再次运行。

由于已经发布了必要的用户文档(当前用户的用户文档),因此不需要方法调用。您可以使用find(一个被动数据源)重写您的帮助程序,如下所示:

Template.notifs.helpers({
  notifs: function() {
    return Meteor.users.findOne({_id: Meteor.userId()});
  }
});

但是,Meteor.user()为您提供了相同的功能:

Template.notifs.helpers({
  notifs: function() {
    return Meteor.user();
  }
});

但是,您甚至不需要这样做,因为模板附带{{currentUser}}帮助器。因此,您可以完全放弃帮助程序并修改模板,如下所示:

<template name='notifs'>
  {{#each currentUser.notifs}}
    <p>...</p>
  {{/each}}
</template>

如果您确实需要帮助中的流星调用结果,您应该阅读this question的答案。