2015-03-25 73 views
0

我想移除在当前点注册的观察者。说我有以下组成部分:移除Ember组件中的观察者

export default Ember.Component.extend({ 
    observeSomeProp: function() { 
     //do something 
    }.observes('someProp'), 

    obserOtherProp: function() { 
     if(condition) { 
      //remove observeSomeProp 
     } 
    }.observes('otherProp') 
}); 

我读的文档,该removeObserver功能需要三个参数的“钥匙”,“目标”和“方法”。对于给定的例子,我想'方法'的参数应该是observeSomeProp,但'钥匙'和'目标'呢?

回答

2

你对'方法'参数是正确的,但我不认为你可以删除一个硬编码到像这样的组件的观察者(据我读过的...)。至于其他人,'钥匙'将是你想要观看的财产,所以'someProp'和'目标'将是你正在工作的视图/组件空间,所以你的情况只是this

尝试增加您的观察员willInsertElement和删除它们willDestroyElement

export default Ember.Component.extend({ 
    willInsertElement: function() { 
    var self = this; 

    // Add observers 
    self.addObserver('self.someProp', self, self.propObserver); 
    self.addObserver('self.otherProp', self, self.otherPropObserver); 

    return self.super(); 
    }, 

    propObserver: function() { 
    //Do something 
    }, 

    otherPropObserver: function() { 
    //Do something else 
    if(condition) { 
     //remove propObserver 
     var self = this; 
     this.removeAnObserver('self.someProp', self, self.propObserver); 
    } 
    }, 

    // This is the method that's removing all the observers 
    removeAnObserver: function (key, target, method) { 
    // Remove observer 
    self.removeObserver(key, target, method); 
    }, 

    willDestroyElement: function() { 
    var self = this; 

    //remove any observers you set in willInsertElement 
    this.removeAnObserver('self.someProp', self, self.propObserver); 
    this.removeAnObserver('self.otherProp', self, self.otherPropObserver); 
    } 
}); 

它可能看起来像很多更多的代码,但willInsertElementwillDestroyElement可用于在您的组件有很多其他的东西,如果你觉得它太拥挤,你可以使用mixin进行优化。

+0

Thx为优秀的解释! – 2015-03-25 16:33:06