次のようなイベントを持つルートがあると仮定します
App.FooRoute = Ember.Route.extend({
events: {
anAction: function(){
}
}
})
別のルート/コントローラーのビューからトリガーするにはどうすればよいですか?
<a {{action anAction target='???'}}> a link </a>
次のようなイベントを持つルートがあると仮定します
App.FooRoute = Ember.Route.extend({
events: {
anAction: function(){
}
}
})
別のルート/コントローラーのビューからトリガーするにはどうすればよいですか?
<a {{action anAction target='???'}}> a link </a>
次のようなルートがあるとします。
App.Router
|
+ FooRoute
|
+ BarRoute
FooRoute
からにアクションを送信するとはどういう意味BarRoute
ですか? ユーザーは に移動した/foo
ため、FooModel
、FooController
、およびFooView
は初期化されましたが、それらはまだ初期化されBar*
ていません。アクションは何をしますか?
この場合、BarModel
周囲を持っていることが の前提条件ですFooRoute
。これを解決する最も Ember らしい方法は、ネストされたルートを使用することです。
App.Router.map(function() {
this.resource('bar', function() {
this.route('foo');
}
});
ユーザーが/bars/123/foo
リンクにアクセスしてクリックすると、 がトリガーされanAction
ます。Ember は自動的にそのアクションをルート階層にバブリングするので、anAction
onを簡単に定義できますBarRoute
。
この場合、 aBarModel
は不要です。anAction
は実際には関連していないことを行いますが、関連Foo
もありませんBar
。anAction
同じバブリング トリックを使用できますが、 onを定義する代わりにBarRoute
、メイン ルーターで定義します。
アクションに「現在のユーザー」が必要だとしましょう。このケースは、ルートをネストする必要がないという点で #2 によく似ています。ただし、 のようなグローバルにアドレス可能なコントローラーが必要ですApp.currentUserController
。target
これは、のとして直接指定できます{{action}}
。
上記のオプションのいずれも適切でないと思われる場合は、 を使用して のプロパティcontrollerFor
を設定できます。barController
fooController
App.FooRoute = Ember.Route.extend({
setupController: function(controller) {
var barController = this.controllerFor('bar');
controller.set('barController', barController);
}
});
その後、行うことができます{{action anAction target=barController}}
。
Ember はコントローラーに対して自動的にアクションを試行し、ルート階層をバブルアップします。モデルが他のモデルに依存している場合、前提条件が確実に接続されるように、ネストされたルートまたはグローバル コントローラーが必要になる場合があります。
Ember Docsで説明されているように、Ember.ViewTargetActionSupport と呼ばれる組み込みの mixin を使用して、アプリ内の別のコントローラーまたはビューまたはルートにアクションを送信できます。
問題を処理する簡単な方法は次のとおりです。
現在のテンプレート:
<a {{action 'actionInView' target='view'}}>Click me</a>
景色:
App.CurrentView = Em.View.extend(Em.ViewTargetActionSupport, { // Note the mixin
actions: { // Actions hash
actionInView: {
this.triggerAction({ // Without a target this will bubble through the routes
action: 'theActionToCall', // Name of the action you *actually* want to call
target: App.TargetController, // Or whatever the name of your target is
});
},
},
});
ターゲット コントローラー:
App.TargetController = Em.ObjectController.extend({
actions: {
theActionToCall: {
// This is where you do the action stuff that you *actually* are trying to do
},
},
});
基本的に、actionInView と呼ばれるアクションは、アプリケーションの別の部分にあるために実際に必要なアクションを呼び出すだけで、アクセスできません。ターゲットを指定しない場合、アクションを親ルートまたはアプリケーション ルートに配置すると、呼び出されます。