在emberjs路线中使用slu ..

时间:2013-02-18 22:41:02

标签: ember.js ember-data

我正在试图弄清楚如何在我的余烬路线中使用slug(我的模型的属性)以获得更清晰的网址。

我希望我的路线看起来像这样:

http://www.server.com/#/newsitems/newsitem-title-in-slug-format/1

而不是:

http://www.server.com/#/newsitems/1/1

如您所见,我想用实际的slug属性替换newsitem的id。以下是我的Newsitem模型的样子:

App.Newsitem = DS.Model.extend({
    slug: DS.attr('string'),
    title: DS.attr('string'),
    summary: DS.attr('string'),
});

slug属性以这种格式接收一个干净的文本属性:title-in-slug-format

这是我目前的路由器地图:

App.Router.map(function(){
  this.resource('newsitems', function(){
    this.resource('newsitem', {path:':newsitem_id'});
  });
});

我尝试用newsitem_id替换newsitem_slug,但这不起作用。还有其他建议吗?

2 个答案:

答案 0 :(得分:9)

非常感谢迈克尔指出我正确的方向。但是,我认为这是因为我在rc-1版本的ember中工作,我没有为此重写模型钩子。我唯一要做的就是:

App.NewsitemRoute = Ember.Route.extend({
  serialize: function(model, params) {
    return { newsitem_id: model.get('slug') };
  }
});

答案 1 :(得分:2)

要使这项工作需要几个步骤。首先,您需要自定义路由以覆盖模型钩子:

App.NewsitemRoute = Ember.Route.extend({
  model: function(params) {
    console.log("Searching for newsitem with slug: ", params.newsitem_id);
    var newsitems = App.Newsitem.findQuery({ slug: params.newsitem_id });
    newsitems.one("didLoad", function() {
      newsitems.resolve(newsitems.get("firstObject"));
    });
    return newsitems;
  }
});

在上面的例子中,我们查询App.Newsitem以查找与指定的slug匹配的记录。它比简单的基于id的查找更复杂,因为我们需要将查询结果数组转换为单个记录。有关其工作原理的详细信息,请参阅:how-to-find-a-model-by-any-attribute-in-ember-dot-js

此外,您需要实现serialize,以便ember linkTo帮助程序能够正确创建链接