我已经升级到ember的最新版本。我注意到一个潜在的问题,当一个组件函数观察一个outercontext属性时,它实际上是在实际组件初始化之前初始化的。
<美元安贝版本/strong>
version: 1.13.1
node: 0.12.6
npm: 2.12.1
为了演示,我使用以下hbs插入test组件:
{{test-component parentController=controller}}
ember的旧版本
test-component.js
feedLoadedChanged: function(){
var self = this;
alert("feedLoadedChanged and self initialized" + self.get('parentController').get('feedLoaded'));
}.observes('parentController.feedLoaded'),
在以前的ember版本中,上面的警告可以成功地工作。然而,在当前版本的ember中,self/this变量指向的是Window对象,而不是组件。
所以我认为这是由于feedloaddchanged函数被初始化之前的组件,它的自我初始化。
ember的当前版本
对于ember的当前版本,我做了以下更改。didInsertElement将self组件捕获到变量_self中,并且只有当该变量存在时才调用原始的警报函数。
下面的代码修复了这个问题:
export default Ember.Component.extend({
didInsertElement: function(){
var self = this;
self.set('_self', this);
},
feedLoadedChanged: function(){
var self = this.get('_self');
alert('feedLoadedChanged');
if(self){
alert("feedLoadedChanged and self initalized" + self.get('parentController').get('feedLoaded'));
} else {
alert("feedLoadedChanged and self NOT initalized");
}
}.observes('parentController.feedLoaded')
});
这是在应用程序加载期间发生的警报序列。
- feedLoadedChanged
- feedloaddchanged和self未初始化
- feedLoadedChanged
- feedloaddchanged和self initiizedtrue(这是原始警报)
所以我想知道在组件本身之前组件函数的初始化是否存在问题或预期行为?
使用didInsertElement生命周期方法结合Joel建议的手动addObserver已经解决了这个问题。
export default Ember.Component.extend({
didInsertElement: function(){
this.addObserver('parentController.feedLoaded',this,'feedLoadedChanged');
}
feedLoadedChanged: function(){
alert("feedLoadedChanged and self initalized" + this.get('parentController.feedLoaded'));
}
});