我有一个应用程序,您可以选择(或添加,如果它们不存在!)来自第一个页面上某个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以包含此哈希?
如果没有,那会是更好的方法吗?
答案 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, ... });