使用didInsertElement时与emberjs和jquery不一致

时间:2012-12-13 15:35:11

标签: javascript jquery ember.js

我目前正在使用emberjs构建一个应用程序,即将完成,但我有一些与应用程序中的视图相关的didInsertElement方法相关的不一致。 这是代码:

     didInsertElement : function(){           
        Ember.run.next(this,function(){
            var sub = this.$(document).find('.sub_t');
            $(sub).not('button').siblings('.inside').toggle();
            $(sub).each(function(i){
                $(this).attr('id','s_t' + i + '');
                var s_t = $(this).nextUntil(".sub_t");
                $(s_t).not('button').wrapAll("<div class='s_t" + i + "'></div>");
            });
         });
    },

问题是,即使我没有使用Ember.run.next,应用程序视图反应也不一致。我只是想在我的视图中修改内容。有时jquery工作有时它不是,并且不清楚如何重现这个bug。

是否与加载文件的大小有关? 或者是滥用Ember运行循环还是插入元素方法?

有人对此有所提示吗?或暗示正在发生的事情以及我可以做些什么来解决这个问题?

1 个答案:

答案 0 :(得分:5)

调用didInsertElement时,可以保证视图的元素已添加到DOM中。如果您还想保证已添加视图的子视图,则可以在afterRender队列上安排一个操作,该队列已添加here。即。

Ember.run.scheduleOnce('afterRender', this, function(){
    // do something when my view hierarchy has been rendered
});

这将取代Ember.run.next,这在didInsertElement处理程序中很少是一个好主意。

此外,在didInsertElement处理程序中,您几乎应该始终使用作用域jQuery选择器this.$(),而不是全局$

在这两个提示之间,你应该能够让事情始终如一。如果你不能,你可以创建一个JSFiddle,显示你想要完成的简化版本,我很乐意看到它。