1

アプリケーションコントローラーでいくつかのアクションと計算されたプロパティを設定し、別のコントローラーで計算されたプロパティを使用したい場合、現在、他のすべてのコントローラーでこのプロパティを手動で設定する必要があります。

これが私が今やっている方法です:

App.ApplicationController = Ember.Controller.extend
  isOn: true
  actions:
    on: ->
      this.set('isOn', true);
    off: ->
      this.set('isOn', false);

App.IndexController = Ember.Controller.extend
  needs: ['application']
  isOn: Ember.computed.alias("controllers.application.isOn")

2 つの質問:

  • 自動生成されるすべてのコントローラーにこれを挿入するにはどうすればよいですか?
  • これは、Ember でグローバル アクション/プロパティを実装するための最良の方法ですか?
4

1 に答える 1

1

理論的には、必要なことを行うためにそれreopenClassを再度開いEmber.Controllerて拡張するために使用できます。jsfiddle で試してみましたが、うまくいきませんでした。

私が仕事に就いたのはEmber.Mixin.

App.IsOn = Ember.Mixin.create({
  needs: ['application'],
  isOn: Ember.computed.alias("controllers.application.isOn")
})

App.IndexController = Ember.Controller.extend(App.IsOn,{});

自動生成されたコントローラーは処理しませんが、他にコントローラーが必要ない場合は、1 行だけで機能をコントローラーに入れることができます。

すべてが機能しているjsfiddleは次のとおりです。

http://jsfiddle.net/DqeLv/

編集: の代わりにtoggleOnメソッドを使用したいことも追加する必要があります。イベントのバブリングは、最も具体的なコントローラーから、そのコントローラーのルート、そして連続する各親ルート (コントローラーではありません) に進みます。ApplicationRouteApplicationController

つまり、あなたが"/users/new"アクションをトリガーすると、次のようになります:

UsersNewController=> UsersNewRoute=> UsersRoute=>ApplicationRoute

編集 #2: わかりました。しばらく眠った後reopen、自動生成されたコントローラーが自動的にisOnプロパティを取得できるように作業を開始できました。

Ember.Controller.reopen({
    needs: ['application'],
    isOn: Ember.computed.alias("controllers.application.isOn")
});

これは、ArrayControllerorのインスタンスではなく、「一般的な」コントローラーでのみ機能するようですObjectController(を返さないルートのみmodel)。

ArrayController自動生成されたObjectControllerインスタンスで機能させたい場合はreopen、これらの 2 つのクラスを使用できます。

Ember.ArrayController.reopen({ ... })

http://jsfiddle.net/HTPaF/2/

于 2013-09-07T05:43:26.930 に答える