【问题标题】:How to wait for Meteor.user() to be defined in Template onRendered如何等待在模板 onRendered 中定义 Meteor.user()
【发布时间】:2016-05-08 18:48:12
【问题描述】:

我正在从事 Meteor 项目,我需要访问存储在用户个人资料中的一些信息以在页面上制作地图。但是,当我尝试访问 Meteor.user() 时,我收到 undefined,因为调用该函数时,Meteor.user() 尚未加载。

Template.body.onRendered () ->
    console.log Meteor.user()
    address = Meteor.user()['profile']['address']

    GoogleMaps.ready 'studyMap', (map) ->
        # maps code that relies on address

因为 Meteor.user() 没有定义,我无法让地图工作。如何等待 Meteor.user() 被定义?

【问题讨论】:

    标签: javascript google-maps meteor coffeescript


    【解决方案1】:

    我认为只有在 address = Meteor.user()['profile']['address'] 加载时才需要异步回调来加载地图。至于如何实现,我不太确定。

    【讨论】:

      【解决方案2】:

      我的一个应用必须执行类似的操作才能等待订阅。我在路由器中定义了 waitOn() 处理程序。

      Router.map(function(){
        this.route('Brocator', {
          path: '/',
          template: 'brocator',
          waitOn: function() {
            return (Meteor.subscribe('people', this.params._gridId)
              && Meteor.subscribe('gridlog', this.params._gridId) );
          },
          data: function() {
            var gridId = this.params._gridId;
            return (People.find({gridId: gridId})
              && GridLog.find({gridId: gridId}));
          },
          fastRender: true
        }),
        ... other routes deleted for clarity
      })
      

      你可能会决定使用类似

      的东西
      return Meteor.user() != 'undefined';
      

      在您的 waitOn() 处理程序中。

      【讨论】:

      • 感谢您的回复。我尝试将 waitOn 添加到我的路由器,但遇到了一些问题。首先,waitOn 抛出一个错误,说“fn 不是函数”(我的函数只是 () -> return Meteor.user() != undefined),所以 waitOn 不起作用。其次,来自实际客户端的 console.log 在调用 waitOn 之前被记录,所以它发生得更早。有什么想法吗?
      • 看起来我使用的渲染处理程序已被弃用,并且使用新的 onRender 巧妙地改变了行为。 stackoverflow.com/questions/29809702/… 我还要看看如何为我的代码更新它。
      • 这几乎与您要查找的代码完全相同。它将“等待用户通过自动运行加载”。 stackoverflow.com/questions/30222429/…
      【解决方案3】:

      发布了流星/反应here 的答案,但同样可以使用 blaze。我不熟悉 blaze,但在您的 Template.body.onRendered 函数中,您可以收听以确保在呈现任何内容之前配置登录服务。

      Tracker.autorun(() => {
        if (Accounts.loginServicesConfigured()) {
          // accounts is ready go ahead and render
        } else {
          // still waiting show loading spinner
        }
      });
      

      我建议将此逻辑提取到更高的级别,这样您就不会一直重复相同的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多