在Ember中创建自定义绑定

时间:2013-10-23 05:32:17

标签: ember.js

不确定这是否是最好的方法。我需要在更改值的边界之前添加延迟。这有多种情况,但常见的是搜索文本已更改。我们在文本框中输入内容,我们不想立即过滤列表。我们想介绍一下延迟。有多种方法可以实现这一点,主要是通过创建自定义视图。

我在考虑添加自定义绑定。这是它的外观:

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相同的可扩展性模式,所以我不确定这是否是正确的方法。

1 个答案:

答案 0 :(得分:1)

我看到的唯一问题是你在某种程度上在ember之外设置属性同步。另一方面,您正在使用ember方法和调度程序来执行此操作,因此它不是一个糟糕的构造。老实说,除了你上面的机制之外,你可以做下面两个中的一个(我确定你已经知道了),或者你可以为一个extendedBindingProperty或类似的东西做ember的公关。

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

});