使用ember序列化器的Seo路由

时间:2013-09-17 19:00:35

标签: javascript ember.js ember-data

我遵循示例emberjs指南

...
this.route('author', { path: '/author/:post_userName' });
...

App.PostsAuthorRoute = Ember.Route.extend({
  model: function(params) {
    return App.Post.find({userName : params.userName});
  },

  serialize:function(model) {
    return { post_userName: model.get('userName')};
  }
});

然后是

的链接
Author {{#linkTo 'posts.author' post }} {{post.userName }} {{/linkTo}}

有趣的是当我点击链接时出现路由错误

Error while loading route: TypeError {}
Uncaught TypeError: Object [Object Object] has no method 'slice'

但是当我重新加载页面时,会显示完整的数据。

如何解决路由错误,实际上我不明白为什么我会收到错误并在重新加载页面时解决

这是类似案例的jsbin。

http://jsbin.com/aZIXaYo/31/edit

1 个答案:

答案 0 :(得分:1)

问题在于您传递给link-to的对象。你这样做了:

Author {{#linkTo 'posts.author' post }} {{post.userName }} {{/linkTo}}

传递Postauthor路线。将模型传递给link-to会导致跳过路径上的model挂钩,而是使用传递的模型。当您点击重新加载时,会执行model挂钩并将PostsAuthor路由的模型设置为Post个对象的集合,然后事情按预期工作。

要做事Ember Way(TM),您需要拥有与Author模型相关的Post模型。然后,你有一个AuthorRouteAuthorController needs一个PostsController。在您的链接中,您将传递post.author,然后使用setupController挂钩来填充PostsController的集合。像这样:

App.Post = DS.Model.extend({
  author : DS.belongsTo('post'),
  title  : DS.attr('string')
});

App.Author = DS.Model.extend({
  name : DS.attr('string'),
  userName : DS.attr('string')
});

App.AuthorRoute = DS.Route.extend({
  model : function(){ // not called when the author is passed in to #link-to
    return this.store.find('author',{userName : params.post_userName})
  },
  setupController : function(controller,model){
    this._super(controller,model);
    this.controllerFor('posts').set('content', this.store.find('post',{userName : model.userName}))
  }
});

App.AuthorController = Ember.ObjectController.extend({
  needs : ['posts']
});

App.PostsController = Ember.ArrayController.extend({
 sortProperties : ['name']
});

然后是模板:

Author {{#linkTo 'posts.author' post.author }} {{post.author.name }} {{/linkTo}}