0

これまで、私は通常、サーバーにアクセスし、データを取得してコントローラーに配置するためのすべての機能を含むデータソースクラスを持っていました。これは次のようになります。

...
App.DataSource = Ember.Object.extend({
  getBooks: function(callback) {
    $.ajax({
      url: '/books.json',
      done: function(data){
        //process the data
        App.get('router.booksController').set('content', processedData);
      }
    });
  }
});

App.dataSource = App.DataSource.create();
...

ただし、4より前のバージョンがリリースされたため、ルーターからコントローラーにアクセスできなくなり、この質問で説明されているように、コントローラーへのアクセスが非常に制限されているようです。

それで、これらの変更によると、これはもう不可能ですか?推奨される方法は何ですか?

4

2 に答える 2

1

個人的には、この意味でEmberを誤って使用していると思います。App.DataSourceオブジェクトにコントローラーを認識させるのは奇妙に思えます。自問する2つの重要な質問:

  1. このオブジェクトがコントローラーにデータを入力する責任があるのはなぜですか?
  2. コントローラーが自分自身にデータを入力する責任を負わないのはなぜですか?

@Matt:私もこのthis.controllerForメソッドを使用していますが、その後非推奨になりました。代わりに、次のneedsアプローチを使用する必要があります。

App.IndexController = Ember.Controller.extend({
    // Requires App.ThisController, App.ThatController.
    needs: ['this', 'that']
});

この場合、私は自分自身を投入BooksControllerする責任を負います。多分initメソッドで。

あなたが本当に使う必要があるなら、あなたは本当にApp.DataSourceこれをする別の方法を考える必要があります。

于 2013-02-09T00:59:11.933 に答える
1

ルーターには、コントローラー インスタンスの文字列名を受け取る新しいメソッド controllerFor があります。ルーターへの参照を取得できる限り、ember によってインスタンス化/生成されたコントローラーにアクセスできるはずです。

参照: http://emberjs.com/guides/routing/setting-up-a-controller/

App.Router.controllerFor("books")モデルのように動作しているオブジェクト内でそれをハードコーディングするのは良くありませんが、まだ何かを行うことができるかもしれません。

私が気付いたもう 1 つの奇妙な点は、Ember.Router がドキュメントを検索する Web サイト API に含まれなくなったことです。これは、ルータのコアを、Ember が拡張する独立したプロジェクトなどに移動したためだと思います。

これは github ソースだと思います: https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/system/route.js

于 2013-02-09T00:33:13.013 に答える