如何在Iron Router中获取数据?

时间:2015-11-19 23:00:12

标签: javascript meteor iron-router

在我的网页上,其中包含网址object/:_id,用户通常只能访问一个文档,我已将其设置为:

waitOn: function() {

    return Meteor.subscribe('objects', this.params._id),
},

data: function() {
    return Objects.findOne({_id: this.params._id})
}

然而,也应该可以看一看并使用其他一些物体,但只有与我们正在查看的物体颜色相同的物体,所以我需要那些也可以访问。

以下是我认为可行的方法:

onBeforeAction: function() {
    var self = Objects.findOne({_id: this.params._id})
    var color = self.color
    Session.set('chosenColor', color)
    this.next()
},

waitOn: function() {
    return Meteor.subscribe('objects', Session.get('chosenColor'))
},

data: function() {
    return Objects.findOne({_id: this.params._id})
}

应该注意的是,这首先起作用,但突然间又莫名其妙地停止了工作。由于某种原因,self现在总是“未定义”。

在Iron Router中访问此数据的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

这里有循环逻辑:你正在尝试加载一个对象并在之前获得它的颜色你订阅了要发布该对象的集合。只需将颜色逻辑移动到服务器上的发布功能即可。

客户js:

waitOn: function() {

    return Meteor.subscribe('objects', this.params._id);
},

data: function() {
    return Objects.findOne({_id: this.params._id})
}

服务器js:

Meteor.publish('objects',function(id){
  check(id, Meteor.Collection.ObjectID);
  var self = Objects.findOne({_id: id})
  if ( self ){
    var color = self.color;
    return Objects.find({ color: color });
  }
  else this.ready();
});

答案 1 :(得分:0)

尝试在数据中使用this.ready()条件:

waitOn: function() {
    return Meteor.subscribe('objects');
},

data: function() {
    if (this.ready()) {
        var self = Objects.findOne({_id: this.params._id});
        var color = self.color;

        return Objects.findOne({_id: this.params._id}, color);
    }
}