0

私の EmberJS アプリには、ビュー/DOM の操作とコントローラーでの状態の設定、それに続くモデルの更新を必要とする (ボタンによってトリガーされる) いくつかのアクションがあります。私がこれを行う方法は、私のプログラミングの美学に訴えるものではありません。仕事は完了しますが、見栄えがよくありません:(

ここに私が物事を行う方法の要点があります:

<button {{action 'whatever' target='view'}}></button>

App.MyView = Ember.View.extend({

   actions:{
       whatever:function(){
         var ctrl = this.get('controller');
         ctrl.set('property',value); // arbitrary example of setting a controller property through it's view
         ctrl.controllerMethod(); // invoking a controller method through the view
         **// do some DOM manipulation**  
       }
   }    
});

当然のことながら、ビューで実行しているコントローラー関連のステップをコントローラー メソッドでラップし、ビューを介してそのメソッドを呼び出すことができますが、IMO も同じように見苦しくなります。ビューは、実際に私が行ったようにコントローラーメソッドを呼び出すべきではありません。残念ながら、この特定のアクションには、DOM 操作と、コントローラーでの状態の設定とアクションの実行が必要です。

これを実行するための推奨される方法が何であるかはわかりません。誰でも啓発できますか?

4

2 に答える 2

1

コントローラーからアクションを処理することをお勧めします。プロパティを設定していることに気付きました。これを使用してビューに何かを通知し、ビュー内で DOM 操作を行うことができます。

App.MyView = Ember.View.extend({
   function () {
     **// do some DOM manipulation**  
   }.observe('controller.property'); 
});

私が考える方法は、UI の「アクション」がビジネス イベント (たとえば、クリックではなく addClient) にマップされ、その結果として、モデル、コントローラーのプロパティを変更する可能性のある何かが発生するということです。これらの変更の結果として、理想的にはバインディングを介してビューを直接更新する必要がある場合がありますが、DOM を手動で変更する必要がある場合もあります。

于 2014-02-04T21:25:18.383 に答える
0

@LukeMeliaがコメントで言ったように、コントローラーの変更を実際に処理し、必要に応じてデータバインディングを介してビューを更新する必要があります。

そのため、ビュー ヘルパーから引数を省略するだけでtarget="view"、Ember は最も近いコントローラーで適切なアクションを探し、ルートまでバブリングします。

簡単なコード スニペット (最初の投稿で提供したもの) は次のようになります。

ハンドルバー テンプレート:

<button {{action someAction}}>Fire!</button>

Ember.Controller:

App.MyController = Ember.ObjectController.extend({
  myProperty: 'cool',

  printMyCoolness: function () {
    console.log("I'm using Ember.js!");
  },

  actions: {
    someAction: function () {
      this.set('myProperty', 'set on fire!');
      this.printMyCoolness();
    }
  }
});
于 2014-02-03T18:37:27.400 に答える