2

私は Ember.Router を使用していますが、ルーターがインスタンス化しているコントローラーにオブジェクトをバインドする方法がわかりません。

たとえば、ルーターが特定のルート (「ページ」) 用にインスタンス化するコントローラー クラス (拡張) とコントローラー オブジェクト (作成) を次に示します。ルーター:

// controller used by Router to render the "page" route
App.PageController = Em.ObjectController.extend({
    content: Em.Object.extend({
        foo: 'bar'
    })
});

// global controller for users
App.usersController = Em.ObjectController.extend({
    content: Em.Object.extend({
        fooBinding: App.PageController.foo
        // the above will not work since Em.Router
        // instantiates the page controller dynamically
    })
});

したがって、ルーターがロードされると、App.PageController が App.router.pageController にインスタンス化されますが、それは App.usersController が既に作成された後です。では、App.usersController は、Router が管理しているコントローラーのデータにどのようにアクセスできるのでしょうか?

何か案は?

4

1 に答える 1

5

あなたのサンプルにはいくつかの間違いがあります。

まず、宣言時に Object 値を使用してプロパティを直接設定しないでください。この値は、クラスのすべてのインスタンスで共有されます。ここでは、それはあまり重要ではありませんが、悪い習慣です。この場合、PageController コンテンツをセットアップする良い方法は、次のconnectOutletように呼び出し時にルーターにバインドすることです。

connectOutlets: function (router) {
  var theContainerController = router.get('theContainerController'),
      objectWithFooBar = Ember.Object.create({
    foo: 'bar'
  });
  theContainerController.connectOutlet('page', objectWithFooBar);
}

2 番目の間違いは、 の命名です。これは、通話中にルーターに注入されるクラスであるため、 であるusersController必要があります。ユーザーを複数形にして ObjectController にするのもかなり奇妙に思えます。確かに個別化する必要があります...UsersControllerusersControllerinitialize

最後に、そして確かに質問に関して最も興味深いのは、前の発言が適用されると、次を使用してバインディングをセットアップできるようになることです。

App.UserController = Em.ObjectController.extend({
  fooBinding: 'App.router.pageController.foo'
});

App.routerへのコールの前にセットアップできますApp.initializeUserControllerグローバルシンボルを使用して に直接アクセスするのは間違いなく悪い結合ですがPageController、あなたの場合はうまくいきます。

間違いなくより良い解決策は、呼び出しUserControllerで のコンテンツをバインドすることです。connectOutlet

于 2012-07-26T06:24:30.087 に答える