使用需要访问ArrayController元素

时间:2014-10-04 07:52:50

标签: ember.js ember-data ember-cli

我有以下2个控制器:

控制器/学生/ index.js

import Ember from 'ember';

export default Ember.ObjectController.extend({
    hasDebt: function(){
        var totalCredit = this.get('totalCredit');
        var totalCreditSpent = this.get('totalCreditSpent');

        if (totalCreditSpent > totalCredit) 
        {
            return true;
        }

        return false;
    }.property('payments.@each', 'lessons.@each'),
});

控制器/ students.js

import Ember from 'ember';

export default Ember.ArrayController.extend({
    itemController: 'student/index',
    sortProperties: ['fullName'],
    sortAscending: true,

    debts: function(){
        var allDebts = [];
        var totalDebts = 0;

        this.forEach(function(student){
            if (student.get('hasDebt'))
            {
                allDebts.push({
                    name: student.get('fullName'), 
                    amount: student.get('availableCredit')
                });

                totalDebts += student.get('availableCredit');
            }
        });

        return {'all': allDebts, 'total': totalDebts};
    }.property('this.@each.payments', 'this.@each.lessons'),
});

一切都按预期工作。我可以通过hasDebt访问每个元素的itemController属性。

现在我想在IndexRoute的仪表板中显示债务,因此我创建了以下附加控制器,希望能够通过使用需求来访问StudentsController:< / p>

控制器/ index.js

import Ember from 'ember';

export default Ember.Controller.extend({
    needs: ['students'],

    debts: function(){
        var debts = [];

        console.log( this.get('controllers.students.debts') );

        this.get('controllers.students').forEach(function(student){
            console.log('student');
        });

        return debts;
    }.property(''),
});

我似乎无法访问StudentsController及其任何属性。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我认为计算属性必须观察属性才能被填充。在您的示例中:

<强>控制器/ index.js

export default Ember.Controller.extend({
  needs: ['students'],
  students: Em.computed.alias('controllers.students'),
  debts: function() {
    ...
  }.property('students.debts')
});

在此示例中,我还通过在控制器中提供映射到students的{​​{3}}来更轻松地使用学生。

调试

调试时使用浏览器的控制台也非常方便。尝试运行类似下面的内容,看看会发生什么。

App.__container__.lookup('controller:index').get('students')

这假定您的应用程序存在于 App 命名空间下。