如何在Ember JS中从parentController获取子控制器的引用?

时间:2014-06-03 03:00:32

标签: javascript validation ember.js

我有一个Question模型对象,它有答案数组。问题和答案都有一些属性需要验证。我正在使用ember-validations。当用户尝试保存时,我需要触发问题和答案的验证。所以,我正在触发Question控制器验证但是如何强制QuestionController等待AnswerControllers验证?由于AnswerControllers引用了QuestionController(父级),因此他们可以观察父级的属性并触发它们的验证。但问题是我如何强制QuestionController等待答案控制器验证?问题有自己的属性,因此,QuestionController不能是一个数组控制器!

1 个答案:

答案 0 :(得分:2)

您的子控制器可能使用itemController与某个阵列控制器相关。使用数组控制器的上下文,您可以迭代它,并且您将拥有子控制器的每个实例。

App.FooController = Em.ArrayController.extend({
  itemController: 'bar',
  doSomething: function(){
    this.forEach(function(itemController){
      console.log(itemController);
    });
  }
});

但正如您所提到的,您的问题不是阵列控制器,因此我猜测您可能正在使用模板中的itemController显示答案

{{#each foo in answers itemController='answer'}}

{{/each}}

这会出现问题,因为您无法访问控制器。但是你可以用render

来解决这个问题

所以不要做以上各项,而是

{{render 'answers' answers}}

你有一个答案模板,一个答案控制器。

模板

{{#each foo in answers}}

{{/each}}

控制器

App.AnswersController = Em.ArrayController.extend({
  itemController: 'bar',
  doSomething: function(){
    this.forEach(function(itemController){
      console.log(itemController);
    });
  }
});

现在你可以迭代你的孩子了。