2015-03-25 3 views
0

Я хочу удалить наблюдателя, который я зарегистрировал в текущей точке. Скажем, у меня есть следующие компоненты:Удалить наблюдателя в компоненте Ember

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

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

Я читаю документацию, функции removeObserver необходима три аргумента «ключ», «цель» и «метод». Я полагаю, что аргумент «method» для данного примера будет observeSomeProp, но как насчет «ключа» и «цели»?

ответ

2

Вы правы в параметре «метод», но я не думаю, что вы можете удалить наблюдателя, который жестко закодирован в компонент, подобный этому (насколько я читал ...). Что касается остальных, «ключ» - это свойство, которое вы хотите посмотреть, поэтому «someProp», а «target» - это пространство вида/компонента, в котором вы работаете, так что только 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); 
    } 
}); 

Это может выглядеть намного больше кода, но willInsertElement и willDestroyElement можно использовать для многих других вещей в компоненте, и вы можете оптимизировать работу с микшинами, если чувствуете, что это слишком многолюдно.

+0

Thx за отличное объяснение! –

Смежные вопросы