如何访问didInsertElement中的控制器

时间:2014-02-24 09:57:27

标签: ember.js

我有一个引导下拉列表,我需要在它插入DOM后激活它。视图/控制器与路径无关:它只是我导航栏的一个组件。我在控制器中配置元素id:

App.DropdownController = Ember.ObjectController.extend({
    elId : 'my-element-id',
});

这样我就可以在模板中使用它了:

<a class="dropdown-toggle opener" {{bind-attr id="elId"}} data-toggle="dropdown">
    <i class="icon-off icon-2x"></i>
</a>
...

但在didInsertElement我必须破解我的方式来获得控制器:

App.DropdownView = Ember.View.extend({
    templateName: 'navbar/dropdown',
    didInsertElement: function() {
        var controller = App.__container__.lookup('controller:dropdown'); // TODO: how to properly get controller?
        var elId = controller.get('elId');
        $('#' + elId).dropdown();
    }
});

如何在视图中正确访问控制器?

2 个答案:

答案 0 :(得分:2)

您可以使用视图的controller property来访问控制器。使用此属性,您可以在didInsertElement处理程序中访问它。

var controller = this.get('controller');

答案 1 :(得分:0)

您可以使用this.get('controller'),但一般情况下,最好不要直接访问控制器。我倾向于推送它们或创建依赖项。要以标记的方式设置它们,视图定义它的依赖关系并将它们传入,而不是拉出。

{{view elId=eldId}}

另一种选择是创建派生属性。

App.DropdownView = Ember.View.extend({
  elId: function () { return this.get('controller.elid') }.property('controller.elid');
  didInsertElement: function() {
    $('#' + this.get('elId')).dropdown();
  }
});

该选项看起来类似于pull,但具有衍生属性,从需要的位置删除了属性来自何处的知识。