我试图根据来自文本输入的输入使用Ember.computed.filter
过滤ArrayController的内容。Ember.js:触发'Ember.computed.filter'来更新控制器中属性更改时
App.IndexController = Ember.ArrayController.extend({
filteredPeople: Ember.computed.filter('model', function(person){
var searchFilter = this.get('searchFilter');
var regex = new RegExp(searchFilter, 'i');
return person.firstName.match(regex);
}),
// this is bound to the value of a text input helper
// I'm just pre-filling the value to show that the filtering does work
searchFilter: 'kris'
});
这个工程很棒,并按预期过滤。不过,我希望随时更新searchFilter
的值(即任何时候有人输入到文本输入中)。现在的问题是,只有在模型本身发生变化或控制器第一次加载时才会更新。
有无论如何触发Ember.computed.filter
更新时searchFilter
更新?我使用的是Ember.computed.filter
,因为它似乎比普通的计算属性效率更高,我相信每次都会重新创建整个数组(请让我知道我是否错误)。此外,Ember.compute.filter只是易于使用,非常干净!
我用上面的设置创建了一个JSBin。当用户输入文本框时,我想以某种方式触发Ember.computed.filter
更新自己。
谢谢您的时间和任何援助。
不太容易!这正是我所希望的。我想我甚至在某个时候尝试过它,但一定已经把这个语法稍微放了下来。谢谢你的JSBin。总是有用,以确认它应该工作=) – Sarus
很高兴我能帮上忙。棘手的部分是,如果你只添加'searchFilter'作为依赖关键,它不起作用。可能是因为它以某种方式覆盖了由computed.filter()的第一个参数提供的所需“模型”依赖关键字。但这只是一个猜测,我仍然需要学习很多关于ember内部的知识。 –
@BavoVanGeit一旦'searchFilter'改变了整个数组应该重新呈现?我的印象是'Ember.computed.filer'通过添加/删除项目到相同的数组来避免这种情况,但是当我检查DOM并监视jsbin中的单个'li'时,他们绝对看起来都是每次重新呈现。 –