【问题标题】:How do you do client side routing when saving via methods?通过方法保存时如何进行客户端路由?
【发布时间】:2016-08-18 23:32:37
【问题描述】:

我想保存一些数据并将其显示在视图模板中。所以我想做下面的例子,但使用方法。

Template.postSubmit.events({
  'submit form': function(e) {
    e.preventDefault();

    var post = {
      url: $(e.target).find('[name=url]').val(),
      title: $(e.target).find('[name=title]').val()
    };

    post._id = Posts.insert(post);
    Router.go('postPage', post);
  }
});

我试过了:

'insertClubData': function(clubname, capacity, description, homepage){
    var currentUserId = Meteor.userId();
    var club = {
        clubname: clubname,
        description: description,
        capacity: parseInt(capacity),
        homepage: homepage,
        createdAt: new Date(),
        visitors: 0,
        occupancy: 0,
        trend: "club-1",
        createdBy: currentUserId
    }

    club._id = clubs.insert(club);
    Router.go('club', club);
}, 

但我得到了错误:

调用方法'insertClubData'时出现异常类型错误:对象 功能路由器(req,res,next){I20160425-14:04:55.724(2)? //XXX

这假定父堆栈上没有我们应该的其他路由器 可能会修复

我知道这是因为Router.go 是一种客户端方法。但我也明白你应该避免服务器端路由。那么最优雅的解决方案是什么?

这是我的路线:

Router.route('/club/:_id', {
    name: 'club',
    template: 'club',
    data: function(){
        return clubs.findOne({_id: this.params._id})
    }
});

【问题讨论】:

    标签: meteor


    【解决方案1】:

    怎么样,你从客户端调用method,然后在成功的回调中进行路由。例如:

    Template.postSubmit.events({
      'submit form': function(e) {
        e.preventDefault();
    
        var post = {
          url: $(e.target).find('[name=url]').val(),
          title: $(e.target).find('[name=title]').val()
        };
    
        Meteor.call('insertPost', post, function(error, id) {
          if (error) {
            alert(error)
          } else {
            Router.go('postPage',  {_id: id});
          }
        });
      }
    });
    

    在服务器上

    Meteor.methods({
      insertPost: function(post) {
        // do checks
        id = Posts.insert(post);
        return id;
      }
    });
    

    这对你有用吗?

    【讨论】:

    • 差不多。我必须将路由更改为 Router.go('club', {_id: id}) .缺少的参数是:[“_id”]。传入的参数对象是:“JgsK6ZRaqma8LM9uy”。然后它会路由到正确的 url,例如 localhost:3000/club/XdF4oQLdD7HuiHCY3 但它显示 Data not found?
    • 我的路线也包含在问题中。
    • 这似乎是一个不同的问题,不是吗?如果你将浏览器直接指向这个地址会发生什么:localhost:3000/club/XdF4oQLdD7HuiHCY3?
    • 您有club 数据的发布和订阅吗?
    • 是的。这以前奏效。奇怪的是(我有一个俱乐部列表)如果我单击列表上的链接,它就可以正常工作。但是,如果我在新选项卡中打开 sam 链接,我会得到数据未找到。是的。我有这个出版物 Meteor.publish('clubs', function(){ return clubs.find(); });还有一个模板订阅 Template.club.onCreated(function () { this.subscribe('clubs'); });
    猜你喜欢
    • 2017-09-17
    • 2021-05-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    相关资源
    最近更新 更多