2013-10-23 109 views
1

不确定这是否是最好的方式。我需要在更改值的边界之前添加延迟。对此有多种场景,但常见的一种是对已更改的文本进行搜索。我们在文本框中键入内容,并且不想立即过滤列表。我们想推迟一下。有多种方法可以实现这一点,主要是通过创建自定义视图。在Ember中创建自定义绑定

我想添加一个自定义绑定。这是它的外观:

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

一个评论,这是否正常工作?我有点昏昏欲睡,但看起来每次属性更改时,您都会发送一个新的匿名函数,这个函数不等同于之前的匿名函数,并且会在500毫秒后执行两次。这是完全可能的,我错了,就像我说的,我很困,不愿意现在测试它:) – Kingpin2k

+0

良好的捕获。我试图在发布之前简化代码。现在更新。 –

回答

1

我看到的唯一问题是你在某种程度上设置了在余烬之外的属性同步。另一方面,你正在使用ember方法和调度器来完成它,所以它不是一个可怕的构造。老实说,在上面的机制旁边,你可以做下面两个之一(我敢肯定你知道),或者你可以为一个delayedBindingProperty或类似的东西做一个PR for 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')); 
    } 

}); 
+0

谢谢,这很有用。我确实考虑过这个选择,但是,它并不是真的感觉像是一个管制员关心的问题,而是一种看法/约束关切。这可能只是因为我习惯了Silverlight/WPF,我们有不同类型的绑定(一次性,单向,双向),我们可以很容易地将它们扩展到像这样工作。我很乐意提交公关。不过,我认为真正的价值在于直接在模板上进行操作(不必为了设置绑定而编写自定义视图)。那个阵营的任何想法? –

+0

...在模板中的含义我可以说'value = term',但我还没有找到一种简单的方法来创建这个例如'{{delayed-bind-attr value'term'500}}'只能在助手之外工作。单向绑定也是如此。我还没有找到一种简单的方法来在同一个上下文中声明它们,因为我们可以声明双向绑定。 –