订阅多个模板实例时出现问题

时间:2015-09-21 07:58:23

标签: javascript html meteor meteor-blaze

以下是该方案。我有一个包含#each循环的模板,并呈现特定模板的实例,根据文档在每个模板上设置数据上下文。

<template name = 'live'>
<div class = 'row'>
    {{#each runways}}
        <div class = 'col-md-2'>
            {{> runway_panel}}
        </div>
    {{/each}}
</div>

</template>

这是支持它的帮手:

Template.live.helpers({
    runways: function(){
        return Runway_Data.find();
    }
});

这个有效,我的问题如下。每个live_event_log实例都有一个模板级订阅,订阅了一个采用数据上下文的_id参数的发布,如下所示:

Template.runway_panel.onCreated(function(){
    var instance = this;
    instance.autorun(function(){
        var subscription = instance.subscribe('runway_status', this.data._id);
    });

    instance.status = function(){
        return Runway_Status.find();
    }

});

这是出版物:

Meteor.publish('runway_status', function(runway){ 

    if(this.userId){
        //Retrieve the last know status for the given runway

        return Runway_Status.find({runway: runway});  
    }

});

这一切都崩溃了,我在浏览器控制台上得到了这个:

 [Log] Exception in queued task: http://localhost:3000/client/views/live/runway_panel.js?4efaac87b39527d3dfd3d65a174520f9bce3c565:4:73 (meteor.js, line 888)_withTemplateInstanceFunc@http://localhost:3000/packages/blaze.js?a5c324925e5f6e800a4c618d71caf2848b53bf51:3476:16
http://localhost:3000/packages/blaze.js?a5c324925e5f6e800a4c618d71caf2848b53bf51:1864:54
_withCurrentView@http://localhost:3000/packages/blaze.js?a5c324925e5f6e800a4c618d71caf2848b53bf51:2197:16

一旦我在订阅线上发表评论,其他所有内容都有效,我是否遗漏了一些非常明显的内容?它可能与同一出版物的多个订阅有关吗?

谢谢! :)

感谢Jeremy S.的投入以及夜班后的一些睡眠,我终于在没有自动运行的情况下想出来了。所以这里适合后人:

Template.runway_panel.onCreated(function(){
    var self = this;
    self.subscribe('runway_status', this.data._id);
});

在再次尝试之前,应该尝试睡一觉!

2 个答案:

答案 0 :(得分:0)

首先,userId是一个函数,userId()将返回当前用户ID。您可以查看here以了解instance.subscribe的详细信息。

我认为在runway._id

中获取Meteor.publish时可能会出现问题
Template.runway_panel.onCreated(function(){
  var instance = this;
  // instance subscribe data whose _id is runwayPanelId
  instance.autorun(function(){
    var dataContext = Template.currentData();
    var subscription = instance.subscribe('runway_status', dataContext.runwayPanelId);
  });

  instance.status = function(){
    return Runway_Status.find();
  }
});

// publication
Meteor.publish('runway_status', function(runway){ 
  // using Meteor.userId() to get current user id
  if(Meteor.userId()){
      //Retrieve the last know status for the given runway
      return Runway_Status.find({runway: runway});  
    }
});
<template name = 'live'>
  <div class = 'row'>
    {{#each runways}}
      <div class = 'col-md-2'>
        {{> runway_panel runwayPanelId=_id}}
      </div>
    {{/each}}
  </div>

</template>

答案 1 :(得分:0)

问题在于订阅中的this.data._id,现在它的作用域是最里面的函数。您需要instance.data._id(不反应,因此您不需要autorun)或Template.currentData()(这是被动的)。

Template.runway_panel.onCreated(function(){
    var instance = this;
    instance.autorun(function(){
        var data = Template.currentData();
        var subscription = instance.subscribe('runway_status', data._id);
    });
});

另请注意,在您的出版物中,如果this.ready()this.userId,则应将其标记为undefined。但那并不是错误的根源。