Ember.Controller数组内容过滤

时间:2012-09-04 13:15:25

标签: ember.js ember-data

我有一个小提琴http://jsfiddle.net/kristaps_petersons/9wteJ/2/它加载3个对象并在视图中显示它们。数据显示正常,但我无法在显示之前对其进行过滤。 此

nodes: function(){
        this.get('controller.content').filter(function(item, idx, en){
            console.log('should log this atleast 3x')
        })        
        return this.get('controller.content')
    }.property('controller.content')
当模板迭代值数组时调用

方法,但它永远不会进入循环并打印console.log('should log this atleast 3x')为什么会这样?

2 个答案:

答案 0 :(得分:2)

您正在尝试替换controller.content,同时也绑定它。您需要定义另一个属性,例如filteredContent并将其绑定到controller.content。看看Ember.SortableMixin如何为定义了arrangedContent变量的控制器计算变量sortProperties。使用该方法作为模板,我将实现它:

 filteredContent: Ember.computed('content', function() {
     var content = this.get('content');

     return this.filter(function(item, idx, en) {
        console.log('should log this atleast 3x');
     });        
 }).cacheable()

这应该在控制器中实现,而不是在视图中实现。控制器是数据操作,计算属性和绑定的地方。

然后将视图布局绑定到filteredContent而不是content以显示已过滤的数据。然后,原始内容和过滤的内容都可用。

答案 1 :(得分:0)

好的我工作了,但感觉有点奇怪。首先我将方法移动到Controller类并将其更改为如下所示:

nodes: function(){
    console.log('BEFORE should log this atleast 3x', this.get('content.length'))
    this.get('content').forEach(function(item, idx, en){
        console.log('should log this atleast 3x')
    })
    console.log('AFTER should log this atleast 3x', this.get('content.length'))
    return this.get('content')
}.property('content').cacheable()

因为它应该与buuda的重新定位相同,因为据我所知,文档.poperty()Ember.computed相同。因为它仍然无法正常工作,我将.property('content')更改为.property('content.@each')并且它正在运行。小提琴:http://jsfiddle.net/kristaps_petersons/9wteJ/21/。我想,tempate首先会创建一个绑定到controller.content,并且内容本身不会更改不会再次通知此方法,而是模板在数据可用时提取数据。