1

我有一个小提琴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')为什么会这样?

4

2 回答 2

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显示过滤后的数据。然后原始内容和过滤后的内容都可用。

于 2012-09-05T04:20:48.420 回答
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/。我猜想,该模板首先创建一个绑定,controller.content并且由于内容本身没有更改,因此不会再次通知此方法,而是模板在数据可用时提取数据。

于 2012-09-05T08:18:54.763 回答