15

Ember 1.0-pre2から最新のマスター(43354a98)と新しいルーターに変換するときに問題が発生しました。

一連のレコードの名前とIDだけをロードするルートがあり、それらの各レコードを完全なモデルを表示する別のルートにリンクしようとすると、新しいルートに到着したときに、新しいモデルがロードされません。 、および名前とIDは、使用可能な唯一の属性です。

コード例:

App.Router.map(function() {
  this.route("index");
  this.resource("birds");
  this.resource("bird", {
    path: "/birds/:bird_id"
  });
});

App.BirdsController = Ember.ArrayController.extend({
  birds: [
    {
      name: "Pigeon",
      id: "b.15"
    }, {
      name: "Chicken",
      id: "b.133"
    }, {
      name: "Turkey",
      id: "b.126"
    }, {
      name: "Ostrich",
      id: "b.4"
    }, {
      name: "Barn Owl",
      id: "b.47"
    }
  ]
});

App.BirdRoute = Ember.Route.extend({
  model: function(params) {
    return App.Bird.find(params.bird_id);
  }
});

{{#each bird in birds}}
  <li>{{#linkTo "bird" bird}}{{bird.name}}{{/linkTo}}</li>
{{/each}}

ここで、App.Bird.find()はいくつかのXHRを実行して、一連のリモートAPI(ember-dataを使用しない)からEmber.Objectを構築します。問題を単純化するために、この例のためだけに鳥のリストがコントローラーにハードコードされています。私の実際のアプリケーションでは、リストはリモートAPIからのものです。

私が見ている動作は、/ birdsから開始してリンクのいずれかをクリックすると、ルーターが「bird」に移行し、/#/ birds / b.5に到達しますが、App.Bird.find()は呼び出されることはなく、ページにあるデータは「name」と「id」だけです。ただし、その後ページをリロードすると、App.Bird.find()が呼び出され、モデルが適切に構築されて表示されます。

URL内のIDから強制的に逆シリアル化する方法、またはIDが完全であると想定するオブジェクトではなくlinkToにIDを渡す方法はありますか?私は古いルーターでうまく機能する類似の実装を持っていました。

4

1 に答える 1

19

を使用してナビゲートするときにmodelフックが呼び出されないようです...おそらくこれは、ルートからルートにオブジェクトを渡しており、IDがすでに設定されていると見なされるため、残り火が呼び出す必要がないと考えているためです。オブジェクトに逆シリアル化されます。ページをリロードすると呼び出されるので、これは理にかなっているようです。App.BirdRoute{{#linkTo}}{{#linkTo}}birdsmodelmodel

setupControllerフックを使用してApp.Bird.find()メソッドを呼び出し、その結果をコントローラーに渡しました。これは、直接URLまたは{{#linkTo}}クリックによって呼び出されます。{{#linkTo}}ヘルパーリンクによって呼び出された場合setupControllermodelパラメーターはヘルパーbirdとともに渡されたオブジェクトになります{{#linkTo}}。URLから直接呼び出された場合、フックからの戻り値がパラメーターとしてmodel渡されます。setupControllermodel

これがJSFiddleの例です

アクセス可能なURLの例

App.BirdRoute = Ember.Route.extend({
  model: function(params) {
    return {id: params.bird_id};
  },
  setupController: function(controller, model) {
    var bird_model = App.BirdTest.find(model.id);
    controller.set("content", bird_model);
  }
});
于 2013-01-17T01:01:40.053 に答える