我正在使用slugged URL来获取更清晰的URL:
到此:
问题在于,如果我通过直接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.PostRouter
替换为params.post_slug
,并将以下网址输入我的浏览器http://mydomain.com/#/posts/first-awesome-post;结果:页面CSS和HTML加载但id#1的数据未加载(即未调用模型钩子)我知道在这种情况下我做错了什么吗?
P.S。我目前正在使用EmberJS版本1.0.0-rc.6
答案 0 :(得分: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')};
},
});