1

私は emberjs のバグに出くわしたと思いますが、それをバグとして指摘する前に、そもそも私が何も悪いことをしていないかどうかを知りたいです。私はアーティストのリスト(「マスター」ビューとしましょう)を持っており、ユーザーが「もっと読む」リンクをクリックすると、その特定のアーティストに関する詳細情報が表示されます。URL を読みやすくするために、「スラッグ」(シリアル化) を使用しています。

これは私のルーターがどのように見えるかです:

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') };
  },
*/

これは、ユーザーが「続きを読む」リンクをクリックする前後に実装されたシリアル化フックでどのように見えるかのスクリーンショットです。

クリックする前に

クリック後

ご覧のとおり、突然 2 つの追加のアーティスト オブジェクトが作成され、概要リストに追加されています。なぜこうなった?

4

1 に答える 1

2

ご覧のとおり、突然 2 つの追加のアーティスト オブジェクトが作成され、概要リストに追加されています。なぜこうなった?

これは、ember が (まだ) モデルのfind()メソッドにエイリアスを渡すことをサポートしていないために発生しています。slug と id で同じレコードをロードすると、Ember ID マップに 2 つのレコードが格納されることになります。を読み込ん/artistsで呼び出すApp.Artist.find()と、API は 1、2、3 などの ID を持つ多数のアーティストを返します。ユーザーが詳細リンクをクリックすると、ember が呼び出さApp.Artist.find(slug)れ、数値 ID の代わりに id=slug を使用して応答が保存されます。

ご指摘のとおり、カスタム シリアライザーをコメント アウトすると問題なく動作します。これがないと、数値 ID でアーティストを検索するだけになるからです。

この問題の 1 つの回避策として、数値 ID の代わりにスラッグのみを使用するように API を変更することを検討してください。次に、カスタムシリアライザーを取り除くと、物事はうまくいくはずです. カスタム モデル フックを実装できる別の方法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') };
  }
});

この問題の詳細については、次のブログ投稿を参照してください。 -ドット-js/

于 2013-03-05T17:15:32.773 に答える