【问题标题】:Meteor's reactivity rerendering everything流星的反应性重新渲染一切
【发布时间】:2013-12-24 21:15:04
【问题描述】:

我正在开发 Meteor 应用程序。我在主模板中有这个:

{{# if currentUser}}
    {{> app}}
{{else}}
    {{> login }}
{{/if}}

当用户未登录时显示登录页面,否则显示应用页面。

然后在我的代码中我只是更新当前用户:

Meteor.users.update(Meteor.userId(), {$set: {event_id: 1}});

问题在于这会导致所有内容都被重新渲染,因为当前用户已更改。这本身就是一个大问题。但更糟糕的是,我使用的是 Bootstrap 模式,它不能被重新渲染(bootstrap 保持 javascript 对 dom 元素的引用)

如何让应用仅在 (currentUser == null) 更改其值时重新呈现?

【问题讨论】:

    标签: meteor rendering


    【解决方案1】:

    您可以使用单独的集合来跟踪用户信息,因此您永远不会查询用户集合本身。这个问题应该在 Meteor UI 着陆时解决。您现在可以通过meteor --release template-engine-preview-5.5 运行 Meteor 来尝试一下。

    【讨论】:

    • 我已经了解了新的模板引擎,它运行良好。有没有预计的发售日期?
    • 是的,以及 2014 年初的 Meteor 1.0。可能会更晚;最初的 1.0 预期日期是 2013 年底。
    【解决方案2】:

    让一个取自Meteor.userId()的变量怎么样?

    Template.yourTemplate.isLoggedIn = function(){
      return !!Meteor.userId();
    }
    

    您的模板现在应该是这样的:

    {{#if isLoggedIn}}
        {{> app}}
    {{else}}
        {{> login }}
    {{/if}}
    

    【讨论】:

    • 问题是 Meteor.userId() 也是反应性的,仍然会导致模板重新渲染(即使 !!Meteor.userId() 没有改变值)
    • kusrie,这个解决方案对我有用。我用我在overly-sensitive-current-user.meteor.com 提交的一些代码进行了测试。登录并更改用户配置文件(Meteor.users.update({_id:Meteor.userId()}, {$set:{'profile':{'key':'value1'}}}))并注意应用程序模板不会重新渲染。也许您的代码中还有其他东西导致重新渲染。要点在这里:gist.github.com/jrullmann/7848364
    【解决方案3】:
    Template.main.userLoggedIn = function () {
      return ! Session.equals(Meteor.user(), null);
    };
    

    这体现了 Session.equals 相对于 Session.get 在触发失效方面的优势之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      • 2018-03-21
      • 1970-01-01
      • 2013-11-14
      • 2017-03-14
      • 1970-01-01
      相关资源
      最近更新 更多