0

嗨,我使用Ember 应用程序套件didInsertElement,每次更改路线时都需要触发(子视图 - 在插座中查看)。我需要像全局应用程序 DOM 就绪事件这样的东西。

我找到了 mavilein 的解决方案,但它不起作用。

这是我的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事件。

我知道应用程序视图不会改变,但我需要每次更改子视图时触发的东西。还是我破坏了架构并以其他方式做事?

谢谢你的帮助。

4

1 回答 1

1

嘿@petkopalko,从你在评论中所说的你想将 Holder.js 用于占位符图像,就像你说的那样,由于 holder.js 的工作方式,你需要执行 Holder.run() 函数。您可以做的是将 Holder.run() 添加到每个需要它的视图中, didInsertElement但这不是您想要做的,而且可能会让人厌烦。

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

 export default Ember.View.extend({...

从内部app/views/application.js实际上是导出与 ApplicationView 关联的视图,这就是为什么它只会执行一次,因为应用程序视图会在页面加载时插入。

我正在做一些黑客攻击,似乎有效的是你必须重新打开 Embers 视图类(对象)并将 holder.run 添加到didInsertElement钩子中。在 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();
 }

});

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

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

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

此处附加的是一个 jsbin,它似乎说明了我认为您正在寻找的行为:

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

于 2014-03-11T03:14:22.887 回答