【问题标题】:Why is data set with Meteor Iron Router not available in the template rendered callback?为什么使用 Meteor Iron Router 的数据集在模板渲染回调中不可用?
【发布时间】:2015-12-12 01:12:02
【问题描述】:

这对我来说有点令人费解。我在路由器中设置数据(我在项目的这个阶段非常简单地故意使用它),如下所示:

Router.route('/groups/:_id',function() {
    this.render('groupPage', {
        data : function() {
            return Groups.findOne({_id : this.params._id});
        }
    }, { sort : {time: -1} } );
});

您所期望的数据现在可以在模板助手中使用,但是如果我在呈现的函数中查看“this”,它的null

Template.groupPage.rendered = function() {
    console.log(this);
};

我很想了解原因(假设它是预期结果),或者我正在做/不做的事情是否会导致这种情况?

【问题讨论】:

  • 要获取数据,您应该调用console.log(this.data()); ?
  • 是的,谢谢 - 我只是检查整个对象,但无论我记录 this 还是 this.data,this.data 仍然等于 null,这确实是我问题的症结所在。

标签: meteor iron-router meteor-blaze


【解决方案1】:

根据我的经验,这种情况并不少见。以下是我在路线中的处理方式。

据我了解,模板在客户端订阅时呈现在客户端,因此 null 实际上是可用的数据。

一旦客户端从订阅(服务器)接收到数据,它就会被添加到导致模板重新呈现的集合中。

以下是我用于路由的模式。注意处理无数据情况的if(!this.ready()) return;

Router.route('landing', {
  path: '/b/:b/:brandId/:template',
  onAfterAction: function() {
    if (this.title) document.title = this.title;
  },
  data: function() {
    if(!this.ready()) return;
    var brand = Brands.findOne(this.params.brandId);
    if (!brand) return false;
    this.title = brand.title;
    return brand;
  },
  waitOn: function() {
    return [
      Meteor.subscribe('landingPageByBrandId', this.params.brandId),
      Meteor.subscribe('myProfile'),  // For verification
    ];
  },
});

【讨论】:

    【解决方案2】:

    问题

    我今天自己也经历过。我相信 Template.rendered 回调和 Iron 路由器数据函数之间存在竞争条件。 I have since raised a question as an IronRouter issue on github处理核心问题。

    同时,解决方法:

    选项 1:将代码包装在 window.setTimeout() 中

    Template.groupPage.rendered = function() {
        var data_context = this.data;
        window.setTimeout(function() {
            console.log(data_context);
        }, 100);
    };
    

    选项 2:将代码包装在 this.autorun() 中

    Template.groupPage.rendered = function() {
        var data_context = this.data;
        this.autorun(function() {
            console.log(data_context);
        });
    };
    

    注意:在此选项中,每次模板的数据上下文发生变化时,该函数都会运行!与Tracker.autorun 调用不同,自动运行将与模板一起被销毁。

    【讨论】:

      猜你喜欢
      • 2015-12-22
      • 1970-01-01
      • 2014-01-16
      • 2014-01-03
      • 2023-03-30
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多