Ember.js:自定义 Slug URL 在刷新后不起作用
Ember.js: Custom Slug URLs not working after refresh
我正在尝试为 Ember 中的页面模型设置自定义 slug URL。到目前为止,当我从索引页面调用链接时,它们正在工作。然而,不起作用的是,如果我使用我的自定义 URL 之一刷新页面,则不再找到该模型,我将被重定向到我的 "not found" 页面。所以也许这是一个 "timing" 问题,我应该以不同的方式加载模型吗?
我按照 tutorial in the Ember guides and checked this question on Whosebug 进行操作,但仍然无法正常工作。
到目前为止,这是我的源代码片段:http://emberjs.jsbin.com/hidefetido/1/
提前非常感谢 - 每一个 help/comment 都非常感谢。
首先你必须让你的模型函数来处理 slug 和序列化函数来将模型转换成 url:
export default Ember.Route.extend({
model: function (params) {
return this.store.findAsId('company', 'slug', params.company_slug);
},
serialize: function (model) {
return {company_slug: model.get('slug')};
}
});
第二部分是可选的。服务器一般有问题:
如果你调用 /entity/slug
ember-data 会认为 slug 是 id。所以你必须使用 this.store.find('company', {slug:slug});
但是这将是 return 数组所以你必须转换它。这可以通过在商店中实现自己的功能来简化。
findAsId: function (type, field, value) {
Ember.assert("You need to pass a type, field and value.", arguments.length === 3);
var entity = this.all(type).findBy(field, value);
if (Ember.isEmpty(entity)) {
var query = {};
query[field] = value;
return this.find(type, query).then(function (array) {
Ember.assert('Must find only one object. Found:' + array.get('length'), array.get('length') === 1);
return array.get('firstObject');
});
} else {
return new Ember.RSVP.Promise(function(resolve){
resolve(entity);
});
}
}
store.js 的示例在 gist。
我正在尝试为 Ember 中的页面模型设置自定义 slug URL。到目前为止,当我从索引页面调用链接时,它们正在工作。然而,不起作用的是,如果我使用我的自定义 URL 之一刷新页面,则不再找到该模型,我将被重定向到我的 "not found" 页面。所以也许这是一个 "timing" 问题,我应该以不同的方式加载模型吗?
我按照 tutorial in the Ember guides and checked this question on Whosebug 进行操作,但仍然无法正常工作。
到目前为止,这是我的源代码片段:http://emberjs.jsbin.com/hidefetido/1/
提前非常感谢 - 每一个 help/comment 都非常感谢。
首先你必须让你的模型函数来处理 slug 和序列化函数来将模型转换成 url:
export default Ember.Route.extend({
model: function (params) {
return this.store.findAsId('company', 'slug', params.company_slug);
},
serialize: function (model) {
return {company_slug: model.get('slug')};
}
});
第二部分是可选的。服务器一般有问题:
如果你调用 /entity/slug
ember-data 会认为 slug 是 id。所以你必须使用 this.store.find('company', {slug:slug});
但是这将是 return 数组所以你必须转换它。这可以通过在商店中实现自己的功能来简化。
findAsId: function (type, field, value) {
Ember.assert("You need to pass a type, field and value.", arguments.length === 3);
var entity = this.all(type).findBy(field, value);
if (Ember.isEmpty(entity)) {
var query = {};
query[field] = value;
return this.find(type, query).then(function (array) {
Ember.assert('Must find only one object. Found:' + array.get('length'), array.get('length') === 1);
return array.get('firstObject');
});
} else {
return new Ember.RSVP.Promise(function(resolve){
resolve(entity);
});
}
}
store.js 的示例在 gist。