不确定这是否是最好的方法。我需要在更改值的边界之前添加延迟。这有多种情况,但常见的是搜索文本已更改。我们在文本框中输入内容,我们不想立即过滤列表。我们想介绍一下延迟。有多种方法可以实现这一点,主要是通过创建自定义视图。
我在考虑添加自定义绑定。这是它的外观:
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
相同的可扩展性模式,所以我不确定这是否是正确的方法。
答案 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'));
}
});