我有以下控制器:
App.StudentIndexController = Ember.ObjectController.extend({
hasDebt: function(){
var totalCredit = this.get('totalCredit');
var totalCreditSpent = this.get('totalCreditSpent');
if (totalCreditSpent > totalCredit)
{
return true;
}
else
{
return false;
}
}.property('payments.@each', 'lessons.@each'),
availableCredit: function(){
var totalCredit = this.get('totalCredit');
var totalCreditSpent = this.get('totalCreditSpent');
return totalCredit - totalCreditSpent;
}.property('payments.@each', 'lessons.@each'),
totalCredit: function(){
var totalCredit = 0;
var payments = this.get('payments');
payments.forEach(function(payment){
totalCredit += payment.get('amount');
});
return totalCredit;
}.property('payments.@each', 'lessons.@each'),
totalCreditSpent: function(){
var totalCreditSpent = 0;
var lessons = this.get('lessons');
lessons.forEach(function(lesson){
var duration = lesson.get('duration');
var price;
switch (duration)
{
case 45: price = 15; break;
case 60: price = 20; break;
}
totalCreditSpent += price;
});
return totalCreditSpent;
}.property('payments.@each', 'lessons.@each')
});
我需要在以下控制器中访问其中一些计算所得的属性,以便能够基于每个学生的债务来计算totalDebt:
App.StudentsIndexController = Ember.ArrayController.extend({
totalDebt: function(){
var students = this.model.content;
var totalDebt = 0;
students.forEach(function(student){
if (student.hasDebt)
{
totalDebt += student.availableCredit;
}
});
return totalDebt;
}.property('student.payments.@each', 'student.lessons.@each'),
});
但是,这不起作用。我想不是因为计算的属性在控制器中,并且我正在尝试从模型访问它们。
在StudentIndexController
fromStudentsIndexController
控制器中访问计算属性的最佳解决方案是什么?
看起来,您的需求超出了needs
api的范围,因为您想访问每个模型而不只是一个模型的计算属性。使用该needs
功能可以访问该名称的单例控制器。如果您可以访问一个StudentIndexController
实例,则不会告诉该控制器使用哪种模型(如果有)。相反,您需要使用itemController
api使用学生控制器的非单个实例包装每个学生。
请参阅可解决您问题的jsbin(使用简化的模型)。http://emberjs.jsbin.com/gexuj/2/edit
要点是这样的:数组控制器会将itemController
属性定义为要在上下文中包装每个模型的控制器的常规名称。然后,您可以访问每个学生的那些很酷的计算属性,并根据需要进行汇总。
App.StudentsIndexController = Ember.ArrayController.extend({
itemController: 'studentIndex',
doesAnybodyHaveDebt: function () {
return !!this.filterBy('hasDebt').length;
}.property('@each.hasDebt')
});
在此处查找有关项目控制器属性的更多信息:http : //emberjs.com/api/classes/Ember.ArrayController.html
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句