Ember.js 添加不必要记录的余烬数据
假设我有一个关于动画的应用程序。。 我希望能够通过以下任意URL访问同一动画:Ember.js 添加不必要记录的余烬数据,ember.js,ember-data,Ember.js,Ember Data,假设我有一个关于动画的应用程序。。 我希望能够通过以下任意URL访问同一动画: /a/foo/1 /a/foo /a/1 因此,我的路由器定义如下: // router.js Router.map(function() { this.resource('animes', { path: '/a/' }, function() { this.route('add'); this.route('remove'); }); this.resour
/a/foo/1
/a/foo
/a/1
因此,我的路由器定义如下:
// router.js
Router.map(function() {
this.resource('animes', { path: '/a/' }, function() {
this.route('add');
this.route('remove');
});
this.resource('anime', { path: '/a/:anime_id' });
this.resource('anime', { path: '/a/:slug/:anime_id' }, function() {
this.route('edit');
});
});
我的动画路线
如下所示:
// routes/anime.js
var AnimeRoute = Ember.Route.extend({
afterModel: function(anime, transition) {
// redirect to the url /a/foo/1
if(anime.get('slug') !== transition.params.anime.slug) {
this.replaceWith('anime', anime);
}
},
serialize: function(anime) {
return {
slug: anime.get("slug"),
anime_id: anime.get("id")
};
}
});
export default AnimeRoute;
我的后端配置为返回正确的数据,无论发送的是id还是slug。对于
/a/foo/1
和/a/1
形式的url没有问题,但是对于url:/a/foo
,余烬检查器显示有一个附加记录{id:foo,title:undefined,slug:undefined,…:undefined}
如何解决这个问题
编辑:这里有一个jsbin说明了这个问题:因为您有这个.resource('anime',{path:'/a/:anime_id');在您的路线图中,/a/foo将与此匹配,并假设foo是一个id。因为您的后端无论发送什么都返回数据,这可能会把事情搞砸。如果您像这样覆盖AnimeRoute的模型函数,我想应该可以工作:
App.AnimeRoute = Ember.Route.extend({
model: function(params) {
var slug_or_id = params.anime_id;
if(jQuery.isNumeric(slug_or_id)){ //id
return this.store.find('anime',slug_or_id);
}else{ //slug
return this.store.find('anime', { slug: slug_or_id }).then(function(a) {
return a.get('firstObject');
});
}
},
afterModel: function(anime, transition) {
// redirect to the url /m/foo/1
if(anime.get('slug') !== transition.params.anime.slug) {
this.replaceWith('anime', anime);
}..
编辑:添加了iguider提示,只返回第一个对象。已经尝试过,但我不知道在调用
this.store.find('anime',{slug:slug\u或\u id})时后端应该返回什么
我认为它需要这样的东西:{animes:[{id:3,title:“Foo”,slug:“Foo”}
(注意复数动画和响应的数组),这不是我想要的。事实上,当您使用参数查找模型时,您的后端可能会返回多个模型,因此使用复数名称。但是你还看到余烬检查员的附加记录吗?对于多元化问题,您可能可以使用Ember.Inflector.Inflector:当您说:“您的后端可以返回多个模型”时,您的意思是我可以选择返回单个记录吗?如果没有,如何将数组(包含一条记录)转换为一条记录?请编辑您对以下内容的回答,以便我可以接受:替换返回this.store.find('anime',{slug:slug\u或{u id})
通过返回this.store.find('anime',{slug:slug\u或})。然后(函数(a){return a.get('firstObject');})代码>