Ember.js 在路由上序列化在emberjs中创建模型的额外实例
我想我在emberjs中偶然发现了一个bug,但在我指出它是一个bug之前,我想知道我一开始是否没有做错什么。我有一个艺术家列表(比如“主视图”),当用户单击“阅读更多”链接时,他/她可以看到关于特定艺术家的详细信息。为了使我的URL更具可读性,我正在使用“slug”(序列化) 这就是我的路由器的外观:Ember.js 在路由上序列化在emberjs中创建模型的额外实例,ember.js,Ember.js,我想我在emberjs中偶然发现了一个bug,但在我指出它是一个bug之前,我想知道我一开始是否没有做错什么。我有一个艺术家列表(比如“主视图”),当用户单击“阅读更多”链接时,他/她可以看到关于特定艺术家的详细信息。为了使我的URL更具可读性,我正在使用“slug”(序列化) 这就是我的路由器的外观: App.Router.map(function(){ this.resource('artists', function(){ this.resource('artist', {pa
App.Router.map(function(){
this.resource('artists', function(){
this.resource('artist', {path:':artist_id'});
});
});
我的路线是这样的:
App.ArtistsRoute = Ember.Route.extend({
model: function() {
return App.Artist.find();
}
});
App.ArtistRoute = Ember.Route.extend({
enter: function(){
console.log("ENTER: Artistroute");
},
serialize: function(model, params) {
return { artist_id: model.get('slug') };
}
});
现在,当用户单击艺术家名称时,问题就开始了,然后在一个出口中呈现艺术家的详细信息。由于某些原因,概览列表会更新为空艺术家条目
当我注释掉以下几行时,问题就消失了:
/*
serialize: function(model, params) {
return { artist_id: model.get('slug') };
},
*/
下面是一个屏幕截图,显示了在用户单击“阅读更多”链接之前和之后实现的serialize钩子的样子:
如您所见,突然有两个额外的艺术家对象被创建并添加到概览列表中。为什么会这样
如您所见,突然有两个额外的艺术家对象被创建并添加到概览列表中。为什么会这样
这是因为ember(目前)不支持将别名传递给模型的find()
方法。如果按slug和id加载同一条记录,则最终会在余烬标识映射中存储两条记录。因此,当您加载/artists
并调用App.Artist.find()
时,您的api将返回一组id为1、2、3等的艺术家。当用户单击详细信息链接时,ember将调用App.Artist.find(slug)
,并使用id=slug而不是数字id保存响应
正如您所指出的,当您注释自定义序列化程序时,一切正常,因为如果没有它,您只能通过艺术家的数字id查找艺术家
一个解决这个问题的方法,你可能会考虑改变你的API,只使用SLUG而不是数字ID。然后去掉定制的序列化器,事情就可以正常工作了。您还可以在
App.ArtistRoute
上实现自定义模型挂钩:
App.ArtistRoute = Ember.Route.extend({
model: function(params) {
var artists = App.Artist.find({ slug: params.artist_id });
artists.one("didLoad", function() {
artists.resolve(artists.get("firstObject"));
});
return artists;
}
serialize: function(model, params) {
return { artist_id: model.get('slug') };
}
});
有关此问题的详细信息,请参阅此博客帖子:我需要查看JSFIDLE或jsBin才能提供帮助。我尝试了您的替代解决方案,但始终返回断言错误:
您的服务器返回了一个带有密钥艺术家的哈希,但您没有映射它
。有什么想法吗?谢谢你提供的额外信息,这让我决定将我的后端更改为使用slug而不是数字id.Cool。不确定断言错误,听起来api没有以ember期望的格式返回json