如何将新的_id从方法插入传递到订阅/发布?

时间:2015-05-08 19:42:31

标签: meteor iron-router

我有一个应用程序,您可以选择(或添加,如果它们不存在!)来自第一个页面上某个character的超级英雄/恶棍universe ;然后在第二个页面(build)上为他配备武器,衣服和小工具。

我定义了这条路线:

Router.route('/build/:character', {
  name: 'build'
  waitOn: Meteor.subscribe('characters', {name: this.params.character})
  //and a few other subscriptions and sessions as well for the items
  //and stuff, but those don't matter here.
}

但是,特定字符的链接也会传递一个查询:

 <a href="{{pathFor 'build' query=this.universe}}">

所以最终的链接看起来像这样:

/build/Aquaman?DCComics

现在您所在的页面将显示一个武器和小工具列表,如果您愿意,还可以添加其他内容。然后你应该将想要包含的项目拖到你的英雄版本上。

问题是,此时应用程序不知道你甚至想创建自己的英雄。也许用户只是在寻找乐趣。 用户必须先点击一个按钮来初始化创建过程,这就是创建实际_id的时间,如下所示:

Meteor.methods({
  buildHero: function(heroCharacterName, heroUniverse) {
    var heroToAdd = {}
    heroToAdd['characterName'] = heroCharacterName
    heroToAdd['universe'] = heroUniverse
    heroToAdd['_createdAt'] = new Date()
    CreatedHeroes.insert(heroToAdd, function() {
      if (! error)
        //Update the subscription somehow...
    })
  }
})

所以,新集合中创建的_id必须以某种方式传递给订阅,因为我不希望用户看到已创建的其他个人英雄,只有他自己的新人创造了一个。

我想到的解决方案是以hastag的形式将_id添加到网址中,并在订阅中使用this.params.hash,如下所示:

Router.route('/build/:character', {
   name: 'build'
   waitOn: [Meteor.subscribe('characters', {name: this.params.character}),
     Meteor.subscribe('createdheroes', this.params.hash)]
}

首先,这是一种有效的方法吗?如果是这样,我该如何完成它;我如何实际更新URL以包含此哈希?

如果没有,那会是更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我认为您必须在数据上下文或模板助手中处理此逻辑,而不是订阅/发布。

如果我是你,我会确保新创建的项目由客户发布和订阅,并修改您的搜索查询,只是它只添加新创建的项目。

答案 1 :(得分:1)

我不确定我是否理解你的问题,但我得到了什么,你会知道插入时使用的最后一个_id。

不要让meteor自动完成此操作,只需使用meteor方法创建/获取该_id值&gt;&gt; see Meteor Documentation

var new_id = new Mongo.ObjectID()
col1.insert({ _id: new_id, ... });
col2.insert({ ..., ref_col1_id: new_id, ... });