1

我想我偶然发现了 emberjs 中的一个错误,但在我指出它是一个错误之前,我想知道我是否一开始没有做错任何事情。我有一个艺术家列表(假设是“主”视图),当用户单击“阅读更多”链接时,他/她可以查看有关该特定艺术家的详细信息。为了使我的网址更具可读性,我正在使用“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') };
  },
*/

这是用户单击“阅读更多”链接之前和之后实现的序列化挂钩的屏幕截图:

点击之前

点击后

如您所见,突然有两个额外的艺术家对象被创建并添加到概览列表中。为什么会这样?

4

1 回答 1

2

如您所见,突然有两个额外的艺术家对象被创建并添加到概览列表中。为什么会这样?

发生这种情况是因为 ember(尚)不支持将别名传递给模型的find()方法。如果您通过 slug 和 id 加载相同的记录,您最终会在 Ember 身份映射中存储两条记录。因此,当您加载/artists和调用时App.Artist.find(),您的 api 会返回一堆 id 为 1、2、3 等的艺术家。当用户单击详细信息链接时,ember 正在调用App.Artist.find(slug)并使用 id=slug 而不是数字 id 保存响应。

正如您所指出的,当您注释掉自定义序列化程序时,一切正常,因为没有它,您只能通过数字 id 查找艺术家。

解决此问题的一种方法是,您可以考虑将 api 更改为仅使用 slugs 而不是数字 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') };
  }
});

有关该问题的更详细信息,请参阅此博客文章:http: //darthdeus.github.com/blog/2013/01/31/how-to-find-a-model-by-any-attribute-in-ember -dot-js/

于 2013-03-05T17:15:32.773 回答