3

次のようなイベントを持つルートがあると仮定します

App.FooRoute = Ember.Route.extend({
  events: {
    anAction: function(){
    }
  }
})

別のルート/コントローラーのビューからトリガーするにはどうすればよいですか?

<a {{action anAction target='???'}}> a link </a>
4

2 に答える 2

2

次のようなルートがあるとします。

App.Router
  |
  + FooRoute
  |
  + BarRoute

FooRouteからにアクションを送信するとはどういう意味BarRouteですか? ユーザーは に移動した/fooため、FooModelFooController、およびFooViewは初期化されましたが、それらはまだ初期化されBar*ていません。アクションは何をしますか?

ケース 1: アクションがバーを操作する

この場合、BarModel周囲を持っていることが の前提条件ですFooRoute。これを解決する最も Ember らしい方法は、ネストされたルートを使用することです。

App.Router.map(function() {
  this.resource('bar', function() {
    this.route('foo');
  }
});

ユーザーが/bars/123/fooリンクにアクセスしてクリックすると、 がトリガーされanActionます。Ember は自動的にそのアクションをルート階層にバブリングするので、anActiononを簡単に定義できますBarRoute

ケース 2: アクションにバーは必要ありません

この場合、 aBarModelは不要です。anActionは実際には関連していないことを行いますが、関連FooもありませんBaranAction同じバブリング トリックを使用できますが、 onを定義する代わりにBarRoute、メイン ルーターで定義します。

ケース 3: アクションにグローバル オブジェクトが必要な場合

アクションに「現在のユーザー」が必要だとしましょう。このケースは、ルートをネストする必要がないという点で #2 によく似ています。ただし、 のようなグローバルにアドレス可能なコントローラーが必要ですApp.currentUserControllertargetこれは、のとして直接指定できます{{action}}

ケース 4:本当にBarController をターゲットにしたい

上記のオプションのいずれも適切でないと思われる場合は、 を使用して のプロパティcontrollerForを設定できます。barControllerfooController

App.FooRoute = Ember.Route.extend({
  setupController: function(controller) {
    var barController = this.controllerFor('bar');
    controller.set('barController', barController);
  }
});

その後、行うことができます{{action anAction target=barController}}

概要

Ember はコントローラーに対して自動的にアクションを試行し、ルート階層をバブルアップします。モデルが他のモデルに依存している場合、前提条件が確実に接続されるように、ネストされたルートまたはグローバル コントローラーが必要になる場合があります。

于 2013-02-17T18:07:02.203 に答える
0

Ember Docsで説明されているように、Ember.ViewTargetActionSupport と呼ばれる組み込みの mixin を使用して、アプリ内の別のコントローラーまたはビューまたはルートにアクションを送信できます。

問題を処理する簡単な方法は次のとおりです。

  1. テンプレートで呼び出されたイベントは、現在のビューで処理されます
  2. このビューには Em.ViewTargetActionSupport が混在しています
  3. ビューに記述されたこのイベントは、別のビュー/コントローラー/ルート (ターゲット) で呼び出そうとしているアクションを指定する this.triggerAction 関数を呼び出します。

現在のテンプレート:

<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 と呼ばれるアクションは、アプリケーションの別の部分にあるために実際に必要なアクションを呼び出すだけで、アクセスできません。ターゲットを指定しない場合、アクションを親ルートまたはアプリケーション ルートに配置すると、呼び出されます。

于 2013-12-05T17:01:10.133 に答える