1

これが最善の方法かどうかはわかりません。値からの境界を変更する前に、遅延を追加する必要があります。これには複数のシナリオがありますが、一般的なシナリオは、変更されたテキストの検索です。テキスト ボックスに何かを入力した後、すぐにリストをフィルター処理したくありません。遅延を導入したいと思います。これを実現するには、主にカスタム ビューを作成する方法がいくつかあります。

カスタムバインディングを追加することを考えていました。これはどのように見えるかです:

var DelayedBinding = function () {
  var updateBack = function (target) {
    console.log('called')
    this._scheduleSync(target, 'back');
  };

  Ember.Binding.apply(this, arguments);
  this.toDidChange = function(target) {
    Ember.run.debounce(this, updateBack, target, 5000);
  };
};
DelayedBinding.prototype = Ember.Binding.prototype;

コードでバインディングを設定するとうまく機能します。

new DelayedBinding('value', '_parentView.context.term').connect(this);

それは機能しますが。Bindings は Ember の他のものと同じ拡張性パターンに従っていないように見えるconstructorsので、これが正しい方法であるかどうかはわかりません。

4

1 に答える 1

1

これに関する私の唯一の問題は、ある程度、ember の外部でプロパティの同期を設定していることです。反対に、あなたはそれを行うために ember メソッドとスケジューラを使用しているので、それはひどい構造ではありません。正直なところ、上記のメカニズムに加えて、以下の2つのうちの1つを実行することもできます(これはご存知だと思います)。または、delayedBindingPropertyなどのemberのPRを実行することもできます。

App.SomeController = Ember.ObjectController.extend({

  filterValue:'text they type in',

  filterObserver: function(){
     Ember.run.debounce(this, this.launchFilter, 500);
  }.observes('filterValue'),

  launchFilter: function(){
    // do ajax request, or whatever it is you really want to update
  }

});

または、基になる実際のフィルター値を使用します

App.SomeController = Ember.ObjectController.extend({
  trueFilterValue: null,
  visibleFilterValue:'text they type in',

  filterObserver: function(){
     Ember.run.debounce(this, this.updateFilter, 500);
  }.observes('visibleFilterValue'),

  updateFilter: function(){
    this.set('trueFilterValue',this.get('visibleFilterValue'));
  }

});
于 2013-10-23T05:50:09.753 に答える