2

Ember.js のドキュメントを見ると、いつ使用するかについてかなりあいまいですEmber.run()(強調)。

通常、このメソッドを自分で呼び出す必要はありません。ただし、他のライブラリやプラグインとやり取りするときに生のイベント ハンドラーを実装している場合は、すべてのコードをこの呼び出し内にラップする必要があります。

ソースに目を通し、このトピックに関する投稿を読んだ結果、 を呼び出すEmber.run()と次のことが発生することがわかりました。

  1. 指定されたコールバックがすぐに実行されます。
  2. 実行ループ アルゴリズムが実行され、すべてのキューがフラッシュされ、バインディングが確実に同期されます。

への呼び出し内で他のライブラリのイベントを処理することが推奨される理由を理解しようとしていますEmber.run()。次の例では、jQuery UI スライダーを作成してslideイベントを処理しています。

<script type="text/x-handlebars" data-template-name="index">
  <div id="slider"></div>
  <h2>{{value}}</h2>
  <h3>{{valueProse}}</h3>
</script>

App = Ember.Application.create();

App.IndexController = Ember.Controller.extend({
  actions: {
    valueChange: function (newValue) {
      this.set('value', newValue);
    }
  },

  valueProse: function () {
    var value = this.get('value');
    if (Ember.isNone(value)) {
      return '';
    }
    if (value <= 25) {
      return 'pretty small';
    }
    if (value <= 50) {
      return 'getting bigger';
    }
    if (value <= 75) {
      return 'whoa watch out';
    }
    if (value < 100) {
      return 'can\'t handle it!';      
    }
    return 'ahhhgghuarghblarp!';
  }.property('value')
});

App.IndexView = Ember.View.extend({
  didInsertElement: function () {
    var controller = this.get('controller')
    this.$('#slider').slider({
      min: 0,
      max: 100,
      slide: function (event, ui) {
        // Ember.run(function () {
          controller.send('valueChange', ui.value);
        // });
      }
    });
  }
});

ここに実用的なフィドルがあります:http://jsfiddle.net/ahaurw01/Kwze5/2/

slideイベントが への呼び出し内で処理されるかどうかに関係なく、Ember.run()予期される動作が発生します。これが提供する最適化または保証を理解したいと思います。いずれにせよ、それvalueが設定され、valueProse適切に更新されていることがわかります。これは、コードをラップすることを提案するときにドキュメントが話しているケースの 1 つEmber.run()ですか?

4

1 に答える 1

0

実行のアイデアはEmber.run、サードパーティ ライブラリのイベント リスナーなどの非同期イベントを、ember 実行ループと同期できるようにすることだと思います。

QUnit を自分のプロジェクトに統合し始めたとき、Ember.run について多くのことを学びました。なぜなら、アプリのテストを開始すると、自動 ember.run ループ機能コードが取り出され、それはすべてあなた次第だからです。

于 2013-12-19T06:17:30.220 に答える