0

我正在使用 slugged URLs 来获得更清晰的 URLs 来从这个转换:

http://mydomain.com/#/posts/1

对此:

http://mydomain.com/#/posts/first-awesome-post

问题是,如果我要通过直接 slugged url ( http://mydomain.com/#/posts/first-awesome-post ) 直接访问该页面,我会得到一个空白页面。

这是我所拥有的:

App.Router.map(function() {
    this.resource('posts', function() {
        this.resource('post', { path: ':post_id' });
    });
});

App.Post.FIXTURES = [{
  id: 1,
  name: 'First Awesome Post',
  slug: 'first-awesome-post'
}];

App.PostRoute = Em.Route.extend({
    model: function(params) {
        return App.Post.find(params.post_id);
    },

    setupController: function(controller, model) {
        this._super.apply(this, arguments);
    },

    serialize: function(model, params) {
        return { post_id: model.get('slug')};
    },
});

我尝试了以下方法:

  • 替换params.post_id为并在我的浏览器App.PostRouterparams.post_slug输入以下 URL http://mydomain.com/#/posts/first-awesome-post;结果:页面 CSS 和 HTML 加载,但 id #1 的数据未加载(即未调用模型挂钩)
  • 摆脱序列化功能并在我的浏览器中输入以下 URL http://mydomain.com/#/posts/1;结果:一切正常(CSS、HTML 和数据加载完美)

我可以知道在这种情况下我做错了什么吗?

PS 我目前正在使用 EmberJS 版本 1.0.0-rc.6

4

1 回答 1

1

如果您想使用 slug,您应该更改模型函数并使用 findQuery,因为您通过 id http://emberjs.com/api/data/classes/DS.Store.html#以外的属性搜索模型method_findQuery,但是这个函数返回一个 RecordArray,你可以使用 setupController 钩子来设置数组的唯一一个对象

App.Router.map(function() {
    this.resource('posts', function() {
        this.resource('post', { path: ':post_slug' });
    });
});

App.Post.FIXTURES = [{
  id: 1,
  name: 'First Awesome Post',
  slug: 'first-awesome-post'
}];

App.PostRoute = Em.Route.extend({
    model: function(params) {
        return App.Post.findQuery({slug:params.post_slug});
    },
    setupController: function(controller, model) {
    //If the model comes from a link-to helper it will be an object, if it comes from the route it will be an array of one element
      if(Ember.isArray(model)){
        controller.set('model',model.get('firstObject'));
      }
      else{
        controller.set('model',model);
      }
    },

    serialize: function(model, params) {
        return { post_slug: model.get('slug')};
    },
});
于 2013-11-06T10:42:50.900 回答