2015-04-07 52 views
3

我有一个在Ember控制器上定义的计算属性myArray,该控制器返回一个数组。该阵列应初始化为model的内容,然后根据用户输入的查询过滤model重新进行计算。如何初始化控制器的计算属性以在Ember中建模?

myArray: function() { 
    // return a value that filters model with query 
}.property('model', 'query') 

的问题是,我无法弄清楚如何在同一时间两者都做。以下不能将myArray初始化为model;我猜测是因为模型异步加载,并且init()在它完成之前运行。

// doesn't work 
init: function() { 
    this._super(); 
    this.set('myArray', this.get('model')); 
} 

所以我认为setupController()是设置它的地方,但我发现,设置myArray有导致过滤器更新不工作,也许是因为我被覆盖的定义。

// route definition... 
setupController: function(controller, model) { 
    controller.set('model', model); 
    controller.set('myArray', model); // breaks updating 
} 

我该如何实现我的目标?

回答

2

你想计算属性取决于model - 你不必初始化它,它只是返回正确的事情。

// untested, just to show the idea 
myArray: function() { 
    var query = this.get('query'); 
    var model = this.get('model'); 

    if (query) 
     return doSomethingWith(model, query); 
    else 
     return model; 
}.property('model', 'query') 

由于它是一个属性,初始化和更新将自行进行。

这就是说,Twitter的绝杀是.property的使用将被劝阻,更好地使用Ember.computed

// untested, just to show the idea 
myArray: Ember.computed('model', 'query', function() { 
    var query = this.get('query'); 
    var model = this.get('model'); 

    if (query) 
     return doSomethingWith(model, query); 
    else 
     return model; 
}) 

这只是写它的另一种方式,并且从长远来看可能是mor未来的证明。

+0

设置该值不会覆盖计算出的属性,它会像调用者那样调用计算的属性,如[这里]所述(http://guides.emberjs.com/v1.11.0/object-model/computed-properties /)。 – GJK

+0

我的不好。感谢您指出。我改变了我的答案以反映这一点。 – jnfingerle

1

尝试:

myArray: function() { 
    this.set('myArray', this.get('model'); 
}.property('model', 'query') 
1

编辑:我不知道为什么我会用迂回的方式做事。我想我只是想说明计算属性也可以作为setter。这也将同样的方式工作:

myArray: function() { 
    return this.get('model').filter(function(item) { 
     return (item.property_you_want_to_filter_by === true); 
    }); 
}.property('[email protected]_you_want_to_filter_by', 'query') 

Ember shorthand也将工作:

myArray: Ember.computed.filter('model', function(item) { 
    return (item.property_you_want_to_filter_by === true); 
}); 

你需要采取的事实,计算性能干将制定者的优势。

myArray: function(key, value) { 
    // This is the setter 
    if (arguments.length > 1) { 
     this.set('_myArray', value); 
    } 

    // This is the getter 
    // Do your filtering with `query` here 
    return this.get('_myArray').filter(function(item) { 
     return (item.selected === true); 
    }); 
}.property('_myArray', 'query') 

因为你只把它当你得到一个新的模式,你可以存储(在这种情况下_myArray)在控制器上的私有属性的值。然后对于getter,可以使用存储在该属性中的值与查询结合来返回所需的值。在我上面的例子中,我已经筛选出每个未选​​择的项目。

+0

“灰烬速记”缺少“模型”作为第一个参数。也就是说,如果过滤器确实是由包含的过滤器函数支持的某种逻辑,这确实是最短的版本。 – jnfingerle

相关问题