Iron Router,如何重定向到新创建的项目?

时间:2015-02-10 16:46:43

标签: meteor iron-router

我使用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是否应该能够在此代码的第一个版本中重定向?或者我错过了什么?

1 个答案:

答案 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});
    });
  }
});