如何在Ember.js RC2中的索引模板中的元素上运行一些JS

我正在编写一个Ember.js应用程序,我希望在视图渲染后立即在带有类navbardiv上运行以下Javascript代码:

 $('.navbar').affix({offset: -1000}); 

我不知道有什么方法可以在Ember中轻松完成,因为标准的JQuery $(document).ready()不适用于Ember应用程序。 必须有一些简单的方法来做到这一点,但这个问题的所有其他答案似乎都是复杂的解决方法,并且基于过时的Ember.js版本。

问题模板:

   {{outlet}}  

当您谈到’索引模板’时,我假设您的意思是ApplicationView的模板:

 App.ApplicationView = Ember.View.extend({ didInsertElement : function(){ var that = this; Ember.run.next(function(){ that.$('.navbar').affix({offset: -1000}); }); } }); 

这个解决方案的成分是什么?

  1. View的didInsertElement是放置jQuery和jQuery插件初始化逻辑的正确位置。
  2. 在插入视图的DOM元素时调用didInsertElement挂钩, 但尚未插入内部元素 。 因此,我在调用Ember.run.next()包装了你的逻辑。 此调用确保在视图完全呈现后运行逻辑,因为它在Ember Run循环结束时运行 ,该循环运行循环负责同步对DOM的必要更改。

更新:托马斯提出的更好的解决方案,以减少渲染和运行JS逻辑之间的延迟:

 App.ApplicationView = Ember.View.extend({ didInsertElement : function(){ var that = this; Ember.run.schedule('afterRender',function(){ that.$('.navbar').affix({offset: -1000}); }); } }); 

根据OP的第一个解决方案的问题:

有没有办法减少元素渲染和运行JQuery之间的延迟,或者这是不可能的? 当模板渲染后元素发生变化时,它看起来很有趣。

据托马斯说:

我已经使用了nextschedule在我自己的应用程序中运行jquery并且延迟Brad提及显着少于不存在的时间表

对那些对Ember Run Loop的伟大概念感兴趣的人的进一步阅读: http //alexmatchneer.com/blog/2013/01/12/everything-you-never-wanted-to-know-about-the-ember-跑环/

我的假设:

  • 该代码是HTML页面中唯一的内容(以及您的JavaScript包含)。
  • 这是JavaScript文件中唯一的代码:

    App = Ember.Application.create();

如果这两个假设是正确的,那么您没有使用索引模板,那么您实际上正在使用应用程序模板。 每个视图都有一个init函数。 你最简单的事情是覆盖这个函数,如下所示:

 App.ApplicationView = Ember.View.extend({ init: function(){ this._super(); alert('do something here'); } }); 

这是一个小提琴,供您查看 。