我使用Iron Router为简单的项目/任务应用程序制作了以下路线:
Router.route('/tasks/:_id', {
name: 'tasks.project',
template: 'tasks',
waitOn: function(){
//subscribing to all user's projects and tasks
return [Meteor.subscribe('userTasks'),Meteor.subscribe('userProjects')];
},
onAfterAction: function(){
//Session var used to show only tasks assigned to the project _id
Session.set('currentProject', this.params._id);
}
});
当用户创建新项目时,我想将他重定向到相应的页面(/ tasks / xxxxxxxxx)。 所以,我在服务器上创建了一个方法,并在客户端上进行了模拟,如下所示:
//Server
Meteor.methods({
createProject: function(){
Projects.insert({/*some data*/}, function (error, result) {
});
}
});
//Client
Meteor.methods({
createProject: function(){
Projects.insert({/*some data*/}, function (error, result) {
//Router.go does not work (jumps briefly to /tasks/xxxxxxxxx, and comes back) (I verifiedn result corresponds to the new project id)
Router.go('tasks.project', {_id: result});
});
}
});
我这样称呼这个方法:
Template.tasks.events({
'click .create-project': function(event, template){
Meteor.call('createProject', function(error, result){
});
}
});
客户端插入中的Router.go函数不起作用。
我发现使这项工作的唯一方法是使服务器端插入同步并将Router.go
放入方法调用回调中。就像在这个新版本中一样:
//Server
Meteor.methods({
createProject: function(){
//now synchronous
var id = Projects.insert({/*some data*/});
return id;
}
});
//Client
Meteor.methods({
createProject: function(){
Projects.insert({/*some data*/}, function (error, result) {
});
}
});
Template.tasks.events({
'click .create-project': function(event, template){
Meteor.call('createProject', function(error, result){
Router.go('tasks.project', {_id: result});
});
}
});
但是这种重定向受服务器延迟的影响,我想避免这种情况。考虑到由于模拟方法而立即在客户端集合中创建新项目文档,Iron Router是否应该能够在此代码的第一个版本中重定向?或者我错过了什么?
答案 0 :(得分:2)
我认为您的问题来自于为假客户端日期生成的_id与服务器定义的真实_id之间的区别。实际上,_id是使用Meteor.uuid函数生成的,每次调用它时都会生成一个随机id。
因此,当您收到服务器响应并且数据库已同步时,生成的虚假项目不再存在,并且已由具有不同_id的真实新项目(已保存在服务器上)替换。因此,当发生这种情况时,您的路线指向不再存在的项目。
然后,您应该接受用户的等待时间,或者至少在获得服务器响应时将用户重新路由到正确的URL。因此代码是:
//Server
Meteor.methods({
createProject: function(){
return Projects.insert({/*some data*/});
}
});
//Client
Meteor.methods({
createProject: function(){
Projects.insert({/*some data*/}, function (error, result) {
//Router.go does not work (jumps briefly to /tasks/xxxxxxxxx, and comes back) (I verifiedn result corresponds to the new project id)
Router.go('tasks.project', {_id: result});
});
}
});
你的活动
Template.tasks.events({
'click .create-project': function(event, template){
Meteor.call('createProject', function(error, result){
Router.go('tasks.project', {_id: result});
});
}
});