Ember app kit应用程序视图didInsertElement仅触发一次

时间:2014-02-13 21:36:56

标签: javascript ember.js domready ember-app-kit

您好我使用Ember app kit我需要在每次更改路线时触发didInsertElement(子视图 - 插座中的视图)。我需要像全球应用程序DOM就绪事件。

我找到了mavilein's solution,但它无效。

这是我的app/views/application.js

export default Ember.View.extend({
   didInsertElement : function(){
      this._super();
      Ember.run.scheduleOnce('afterRender', this, this.afterRenderEvent);
   },
   afterRenderEvent : function(){
     // implement this hook in your own subclasses and run your jQuery logic there
     console.log("FIREEEEE");
  }   
});

当我运行应用程序时,它会触发didInsertElement,但是当我更改路径(点击链接)时,它不会触发应用程序视图didInsertElement事件。

我知道应用程序视图不会改变,但我需要每次更改子视图时触发的内容。或者我破坏了架构并以其他方式做到了?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

嘿@petkopalko你在评论中说你想用Holder.js作为占位符图像,就像你说你需要执行Holder.run()函数,因为holder.js的工作方式。您可以做的是将Holder.run()添加到didInsertElement钩子中需要它的每个视图,但这不是您想要做的事情,这可能会让您感到厌倦。

现在从上面的代码中,使用Ember App Kit(EAK)和解析器,我认为你在做什么,说:

 export default Ember.View.extend({...
来自app/views/application.js内的

实际上是导出与ApplicationView关联的View,这就是为什么只执行一次,因为Application View在页面加载时插入。

我做了一点点黑客攻击,似乎有用的是你必须重新打开Embers视图类(对象)并在didInsertElement钩子中添加holder.run。在EAK中,重新打开Ember基类似乎最有效的方法是在app.js文件中进行。

app.js文件中看起来像这样:

 Ember.View.reopen({
   didInsertElement: function(){
     Ember.run.next(function(){
       Holder.run();
     }
   }
 });

它似乎只与ember.run一起使用

 Ember.View.reopen({
   didInsertElement: function(){
     Ember.run(function(){
       Holder.run();
     }
   }
 });

如果您愿意,可以保留所有代码,然后再将其放入app.js

Ember.View.reopen({
  didInsertElement : function(){
    this._super();
    Ember.run.scheduleOnce('afterRender', this, this.afterRenderEvent);
 },
 afterRenderEvent : function(){
   // implement this hook in your own subclasses and run your jQuery logic there
   console.log("FIREEEEE");

   //You can place the holder.run() function here and not in views

   Holder.run();
 }

});

如果你没有在重新打开的视图中将Holder.run()放在你的afterRenderEvent函数中。您必须将它放在您似乎想要的afterRenderEvent函数的视图中。

 SomeView = Ember.View.extend({
   afterRenderEvent: function() {
     this._super();
     Holder.run();      
   }
 }); 

不确定这些方法的副作用,但您可以在实施后探索它们。所以你有几个选择:快乐编码。

这里附有一个jsbin,它似乎说明了我认为你正在寻找的行为:

http://emberjs.jsbin.com/medamata/6/edit