我有一个小提琴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')
为什么会这样?
答案 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
,并且内容本身不会更改不会再次通知此方法,而是模板在数据可用时提取数据。