是否有一个后视图更改挂钩(很像didInsertElement)?

使用didInsertElement钩子,我可以做一些需要的jQuery插件初始化。 但是,如果属性更改,Ember重新呈现视图,但不会再次调用didInsertElement 。 大概这是因为该元素已经在DOM上,并且只有某些片段已经改变。

我的问题是,是否有一种方法我可以重写,或者其他方式来访问通过Ember.View 后,其实际插入到DOM的东西已呈现到DOM的Ember.View

我试图使用afterRender ,但它不起作用。


我想出了解决这个问题的一个不寻常的方法。 当视图部分重新呈现时,您可以创建一个句柄助手来触发事件。 我正在使用Bootstrap和jqPlot,并且需要能够告诉,例如,当div可用于绘制图表时。 有了我的帮手,你可以做到这一点:

{{#if dataIsLoaded}}
    {{trigger didRenderChartDiv}}
    <div id="chartHost"></div>
{{/if}}

您也可以挂钩到childViews数组并观察其上的更改。

类似这样的工作,但我不认为这是一个很好的表现实践。

childViewsArrayDidChange: function() {
  console.log("childViews-Array did change");
}.observes('childViews.@each')

不确定这个问题是否仍然有效,因为它已经有一段时间了。 但没有选择答案。 我遇到了类似的问题,我想根据控制器属性显示表单。 一旦显示表单,我想运行一些JavaScript来绑定事件处理程序。

但是,由于在触发didInsertElement时未显示元素,所以Javascript没有正确绑定事件处理程序。

我的解决方案如下,

控制器和视图

App.FormController  = Ember.Controller.extend({

    myViewVisible : false,

    actions : {

        toggleForm : function(){
            this.toggleProperty('myViewVisible');
            console.log( this.get('myViewVisible') );
        }

    }
});

App.FormView    = Ember.View.extend({

    isVisible:function(){
        this.rerender();
    }.property('controller.myViewVisible'),

    didInsertElement : function(){
        // Do JS stuff
    }

});

和模板

  <script type="text/x-handlebars" data-template-name="form">
      <h2>Form</h2>
      <button {{action 'toggleForm'}}>Toggle form</button>
      {{#if myViewVisible}}
        {{partial "tform"}}
      {{else}}
      <p>Click button to show form</p>
      {{/if}}
  </script>

该视图绑定控制器的属性。 一旦该属性发生变化, isVisible函数就会启动并重新渲染视图。 导致didInsertElement再次触发并将JS代码绑定到现在可用的DOM元素。

希望这可以帮助。

链接地址: http://www.djcxy.com/p/58007.html

上一篇: Is there an after view change hook (much like didInsertElement)?

下一篇: safe method that may only be called once?