Ember.js 在路由上序列化在emberjs中创建模型的额外实例

Ember.js 在路由上序列化在emberjs中创建模型的额外实例,ember.js,Ember.js,我想我在emberjs中偶然发现了一个bug,但在我指出它是一个bug之前,我想知道我一开始是否没有做错什么。我有一个艺术家列表(比如“主视图”),当用户单击“阅读更多”链接时,他/她可以看到关于特定艺术家的详细信息。为了使我的URL更具可读性,我正在使用“slug”(序列化) 这就是我的路由器的外观: App.Router.map(function(){ this.resource('artists', function(){ this.resource('artist', {pa

我想我在emberjs中偶然发现了一个bug,但在我指出它是一个bug之前,我想知道我一开始是否没有做错什么。我有一个艺术家列表(比如“主视图”),当用户单击“阅读更多”链接时,他/她可以看到关于特定艺术家的详细信息。为了使我的URL更具可读性,我正在使用“slug”(序列化)

这就是我的路由器的外观:

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