在没有View的Ember中渲染后运行控制器事件

时间:2015-07-30 11:54:27

标签: ember.js

我是Ember的新手,我想做的是用jQuery执行一些初始化:Ember.$("select").selectpicker();来自定义默认选择(它实际上插入代表隐藏选择的div)。我以前在我的控制器中有这个代码:

init() {
   this._super();
   Ember.run.schedule("afterRender", this, function() {
      this.send("initializeJQuery");
   }
});
actions: {
   initializeJQuery() {
      Ember.$("select").selectpicker();
   }
}

它确实初始化了我的选择标签,但当我转换到另一条路线并返回时 - 它会重新渲染,并且不想调用initializeJQuery方法,尽管运行方法(不是runOnce)。我使用Ember v1.13并且不推荐使用Views,因此我正在寻找替代方法来执行此操作。

希望得到你的帮助。

1 个答案:

答案 0 :(得分:1)

init只被调用一次,因为控制器是单例。通常这些东西放在didInsertElement中,最好放在一个组件中。但为了向您展示正在发生的事情,请考虑以下事项:

App.IndexController = Ember.Controller.extend({
  init: function(){
    console.log("I get called once");
  }
});


App.IndexView = Ember.View.extend({
  didInsertElement: function(){
    console.log("I get called every time Index is rendered");
  }
});

JSBin:http://emberjs.jsbin.com/xacosekuku/edit?html,css,js,output

现在你真正想做的就是制作一个组件。例如,你可以这样做:

App.SelectPickerComponent = Ember.Component.extend({
  tagName: 'select',
  didInsertElement: function(){
    this.$().selectpicker();
  }
});

然后在你的模板中执行:

{{#select-picker}}
  <option value=1>1</option>
  <option value=2>2</option>
  <option value=3>3</option>
{{/select-picker}}

像这样(但添加了我们的jQuery调用):http://emberjs.jsbin.com/xacosekuku/2/edit?html,css,js,output