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);

即使它有效。绑定似乎不像constructorsEmber 中的其他那样遵循相同的可扩展性模式,所以我不确定这是否是正确的方法。

4

1 回答 1

1

我看到的唯一问题是您在某种程度上设置了 ember 之外的属性同步。另一方面,您正在使用 ember 方法和调度程序来执行此操作,因此这不是一个糟糕的构造。老实说,除了上面的机制之外,您可以执行以下两个操作之一(我相信您已经知道),或者您可以为延迟绑定属性或类似的东西为 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 回答