观察子控制器属性

时间:2014-06-13 13:57:10

标签: javascript ember.js handlebars.js

我想从parentController访问我的childrenControllers属性,但我不知道如何访问它们。 基本上,我需要在我的所有孩子(未定义的孩子数)中观察一个属性来计算属性isCheckedtrue的元素数量

我尝试使用属性this.controllers,但这仍然是空的。

你知道怎么做吗? 我正在使用Ember AppKit。

家长控制器:

在我的模板(table.hbs)中:

{{#each item in items}}
    {{render 'table-item' item}} 
{{/each}}

在我的控制器(table.js

export default Ember.ArrayController.extend({
    countCheckboxes: function () {
        //Will count the number of attribute "isChecked" to true
    }.observes('/* children controllers attribute "isChecked" */');
});

儿童管制员:

在我的模板(table-item.hbs

{{input type="checkbox" checked=isChecked}}

在我的控制器(table-item.js

export default Ember.ObjectController.extend({
   isChecked: false
});

2 个答案:

答案 0 :(得分:1)

这可能会对你有所帮助

var YourParentController = Ember.ArrayController.extend({
  actions: {
   countCheckboxes: function(isChecked){
     //do something
   }
  }
});
export default YourParentController

export default Ember.ObjectController.extend({
   needs: ['yourParentController'],
   isChecked: false,
   checkedChanged: function(){
     var parentController = this.get('controllers.yourParentController');
     parentController.send('countCheckboxes', this.get('isChecked'));
   }.observes('isChecked')

});

答案 1 :(得分:0)

除了Saygun的回答之外,您还可以通过迭代阵列控制器的实例来迭代子控制器。如果您希望它可以重复使用,您只需在itemController上使用parentController,而不必使用需求。

App.IndexController = Em.ArrayController.extend({
  itemController:'foo',
  actions: {
    isCheckedChanged: function(item){
      console.log(item);
    },
    selectAll: function(){
      this.forEach(function(item){ // this will be the item controller
        item.set('isChecked', true);
      });
    }
  }
});

App.FooController =Em.ObjectController.extend({
   isChecked: false,
   checkedChanged: function(){
     this.parentController.send('isCheckedChanged', this);
   }.observes('isChecked')
});

http://emberjs.jsbin.com/xureholi/1/edit