您好我使用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
事件。
我知道应用程序视图不会改变,但我需要每次更改子视图时触发的内容。或者我破坏了架构并以其他方式做到了?
感谢您的帮助。
答案 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,它似乎说明了我认为你正在寻找的行为: