4

オブジェクトの「すべて」のレコードを最初に表示できるようにする、非常に基本的なルート設定があります。次に、ユーザーがドロップダウンを選択すると、日付を使用してこれをフィルタリングできます。

私は最近RC2にアップグレードし、「ニーズ」がcontrollerForを置き換えたか、まもなく置き換えることに気付きました。

日付が選択されたときに親の「レコード」ルートのコンテンツを変更するために「records.date」のネストされた/内部ルートが必要な以下の状況で「ニーズ」をどのように使用できるか興味があります。

以下に欠けているのは、App.RecordsDateRoute 内で、「レコード」コントローラーの内容を新しいフィルター (今回は日付順) に変更する必要があることです。私が行っているように見えるすべてのことは、ハンドルバー テンプレートをダンプし、何も表示しません。のような単純なものを使おうとしても

this.controllerFor("records").set('content', App.Record.find(new Date(model.loaded)))

RecordsDateRoute の setupController メソッド内から

App.Router.map(function(match) {
  return this.resource("records", { path: "/" }, function() {
    return this.route("date", { path: "/:date_loaded" });
  });
});

App.RecordsController = Ember.ArrayController.extend({
  selected: 0,
  dates: Ember.computed(function() {
    return App.Date.find();
  }).property()
});

App.RecordsIndexRoute = Ember.Route.extend({
  model: function() {
    this.controllerFor("records").set("selected", 0);
    return App.Record.find();
  }
});

App.RecordsDateRoute = Ember.Route.extend({
  model: function(params) {
    //the controllerFor below seems to be working great ... but what about needs?
    this.controllerFor("records").set("selected", params.date_loaded);
    return App.Date.create({ loaded: params.date_loaded });
  }
});
4

2 に答える 2

3

rc2 では、「controllers.controllerName」を介して他のコントローラーのインスタンスを取得できますthis.get('controllers.records')

「ニーズ」宣言により、参照元コントローラーは、他のコントローラーへの参照をインポートするようになります。あなたの場合、日付コントローラーは次のようになります。

App.RecordsDateRoute = Ember.Route.extend({
  needs: ['records'],
  model: function(params) {
    this.get("controllers.records").set("selected", params.date_loaded);
    return App.Date.create({ loaded: params.date_loaded });
  }
});

に関してApp.Record.find(new Date(model.loaded))、 find() は、モデルのコレクションをフィルタリングするために使用されるキーと値を持つ ID またはオブジェクトを期待していますが、Javascript の日付を指定しています。

ということですApp.Record.find(new App.Date(model.loaded))App.Record.find({ loaded: model.loaded }) /* assuming it's already a Date */

ルートには と呼ばれるメソッドもありinitController(controller, model)ます。責任が多すぎる model() メソッドを「オーバーロード」する代わりに、それを使用できます。http://emberjs.com/api/classes/Ember.Route.html#method_setupController

于 2013-04-05T01:40:31.000 に答える
2

私は最近RC2にアップグレードし、「ニーズ」がcontrollerForを置き換えたか、まもなく置き換えることに気付きました。

ルートフックから別のコントローラーにアクセスするには、引き続きcontrollerFor. コントローラー間の通信用であり、コントローラーでのメソッドController.needsの現在非推奨の使用に取って代わります。controllerFor私の知る限り、ember Routes で controllerFor を廃止する予定はありません。

日付が選択されたときに親の「レコード」ルートのコンテンツを変更するために「records.date」のネストされた/内部ルートが必要な以下の状況で「ニーズ」をどのように使用できるか興味があります。

この使用例では、controllerFor を使用するのが最善です。ルートのフック内からApp.RecordsDateController needs = ['records']レコード コントローラーにアクセスできるように指定することで、この方法でニーズを使用することができます。controller.get('controllers.records')setupController

以下に欠けているのは、App.RecordsDateRoute 内で、「レコード」コントローラーの内容を新しいフィルター (今回は日付順) に変更する必要があることです。私が行っているように見えるすべてのことは、ハンドルバー テンプレートをダンプし、何も表示しません。this.controllerFor("records").set('content', App.Record.find(new Date(model.loaded)))RecordsDateRoute の setupController メソッド内からのような単純なものを使用しようとしても

App.RecordsDateRoute = Ember.Route.extend({
  model: function(params) {
    return App.Date.create({ loaded: params.date_loaded });
  },
  setupController: function(controller, model) {
    var recordsController = this.controllerFor("records");
    // Moved this from model hook, since here you are 'setting up a controller'
    recordsController.set("selected", model.date_loaded);
    // Set query based on current route's model
    var query = { loaded: model.loaded };
    recordsController.set("content", App.Record.find(query));
  }
});
于 2013-04-05T03:50:00.177 に答える