Ember.js 加速慢速余烬内容过滤器
我有以下代码来过滤我的一个控制器上的内容。模板在计算属性上循环,并显示项。然后我有一个过滤内容的文本输入。一切都很好,除了当有大量元素时,过滤变得很慢。我在别处读过一篇帖子,上面有汤姆·戴尔的回答,他试图解释这一点,但这个例子返回的是404 我下一步该怎么做才能加快速度 代码如下: 控制器:Ember.js 加速慢速余烬内容过滤器,ember.js,Ember.js,我有以下代码来过滤我的一个控制器上的内容。模板在计算属性上循环,并显示项。然后我有一个过滤内容的文本输入。一切都很好,除了当有大量元素时,过滤变得很慢。我在别处读过一篇帖子,上面有汤姆·戴尔的回答,他试图解释这一点,但这个例子返回的是404 我下一步该怎么做才能加快速度 代码如下: 控制器: App.PlaylistIndexController = Ember.ObjectController.extend({ filterString: null, filteredSongs
App.PlaylistIndexController = Ember.ObjectController.extend({
filterString: null,
filteredSongs: function() {
var filter = this.get('filterString');
if(filter == undefined) return this.get('content.songs');
filter = filter.toLowerCase();
return this.get('content.songs').filter(function(item, index, enumerable){
if(item.get('artist').toLowerCase().match(filter.toLowerCase()) || item.get('name').toLowerCase().match(filter.toLowerCase()))
return item;
});
}.property('content.songs', 'filterString')
});
模板:
{{#each song in controller.filteredSongs}}
{{song}}{{!-- some song stuff--}}
{{/each}}
过滤器输入:
{{input valueBinding='filterString' placeholder='Search for songs within playlist'}}
您可以尝试以下方法:
这样,用户可以键入文本筛选器,并且只有在用户键入更具体的条件后才会触发搜索。缺点是单字符搜索需要半秒钟的时间 您可以尝试以下方法:
这样,用户可以键入文本筛选器,并且只有在用户键入更具体的条件后才会触发搜索。缺点是单字符搜索需要半秒钟的时间 您可以尝试以下方法:
这样,用户可以键入文本筛选器,并且只有在用户键入更具体的条件后才会触发搜索。缺点是单字符搜索需要半秒钟的时间 您可以尝试以下方法:
这样,用户可以键入文本筛选器,并且只有在用户键入更具体的条件后才会触发搜索。缺点是单字符搜索需要半秒钟的时间 我是一个灰烬之家,但你能在你的房子里使用
@each
吗?类似于“content.songs.@each.artist”,“content.songs.@each.name”
?老实说,我不知道这是否会影响性能:/我想你可以。。。但据我所知,这是一个在每次击键时重新呈现内容的问题。我是Ember noob,但你能在你的属性中使用@each
?类似于“content.songs.@each.artist”,“content.songs.@each.name”
?老实说,我不知道这是否会影响性能:/我想你可以。。。但据我所知,这是一个在每次击键时重新呈现内容的问题。我是Ember noob,但你能在你的属性中使用@each
?类似于“content.songs.@each.artist”,“content.songs.@each.name”
?老实说,我不知道这是否会影响性能:/我想你可以。。。但据我所知,这是一个在每次击键时重新呈现内容的问题。我是Ember noob,但你能在你的属性中使用@each
?类似于“content.songs.@each.artist”,“content.songs.@each.name”
?老实说,我不知道这是否会影响性能:/我想你可以。。。但据我所知,这是一个在每次击键时重新呈现内容的问题。我可以接受搜索结果返回的延迟,只是即使在该示例中,在键入搜索查询时也存在明显的延迟(例如,尝试键入“red1”与“red12”,然后按backspace清除查询)然后您可以使用以下方法:在DOM中绘制所有元素,并在过滤器中显示它们:我可能会在其中实现debounce
,这样用户就不会感觉到延迟,除非他们停止键入@保鲁谢尔:你能对我的回答发表评论吗?这看起来很可靠。我将在本周末尝试实施,并让您知道它是如何工作的。我对返回搜索结果的延迟表示满意,只是在该示例中,键入搜索查询时也会出现明显的延迟(例如,尝试键入“red1”与“red12”,然后按backspace清除查询)然后您可以使用以下方法:在DOM中绘制所有元素,并在过滤器中显示它们:我可能会在其中实现debounce
,这样用户就不会感觉到延迟,除非他们停止键入@保鲁谢尔:你能对我的回答发表评论吗?这看起来很可靠。我将在本周末尝试实施,并让您知道它是如何工作的。我对返回搜索结果的延迟表示满意,只是在该示例中,键入搜索查询时也会出现明显的延迟(例如,尝试键入“red1”与“red12”,然后按backspace清除查询)然后您可以使用以下方法:在DOM中绘制所有元素,并在过滤器中显示它们:我可能会在其中实现debounce
,这样用户就不会感觉到延迟,除非他们停止键入@保鲁谢尔:你能对我的回答发表评论吗?这看起来很可靠。我将在本周末尝试实施,并让您知道它是如何工作的。我对返回搜索结果的延迟表示满意,只是在该示例中,键入搜索查询时也会出现明显的延迟(例如,尝试键入“red1”与“red12”,然后按backspace清除查询)然后您可以使用以下方法:在DOM中绘制所有元素,并在过滤器中显示它们:我可能会在其中实现debounce
,这样用户就不会感觉到延迟,除非他们停止键入@保鲁谢尔:你能对我的回答发表评论吗?这看起来很可靠。我将在这个周末尝试实施,并会让您知道它是如何工作的
onInputFilterChanged: function(){
this.set('canProceedFiltering', false);
Ember.run.later(this, function(){
this.set('filterString', this.get('inputFilterString'));
this.set('canProceedFiltering', true);
},500);
}.observes('inputFilterString')