2016-08-09 1 views
0

Итак, у меня есть обработчик событий jquery, привязанный к window, я удаляю его в willDestroyElement, но вызов события сразу после него в тестовых триггерах вызывает обратный вызов в любом случае (добавление некоторой задержки в тесте фиксирует вещи, но это не кажется правильным ...)Ember.js: удаление обработчика событий в `willDestroyElement` не происходит во времени

_detachHandlers: Ember.on('willDestroyElement', function() { 
    $(window).off('resize');  
    }) 

тест:

this.render(hbs` 
    {{#if show}} 
     {{#my-component timesCalled=(mut timesCalled)}} 
     <button class='button'>Click me!</button> 
     {{/my-component}} 
    {{/if}} 
    `); 
    assert.ok(this.$('button.button').length, 'renders button'); 
    run(() => $(window).trigger('resize')); 
    assert.equal(this.get('timesCalled'), 1, "callback worked one time"); 

    run(() => this.set('show', false)); 
    assert.notOk(this.$('button.button').length, 'component disappears'); 
    run(() => $(window).trigger('resize'));  
    assert.equal(this.get('timesCalled'), 1, "callback detached and counter doesn't change"); 

Я думаю, мне нужно завернуть что-то в перспективе, но что? Пробовал много подходов, которые казались значимыми, но ничего не работало.

ответ

1

Не используйте .on использовать метод willDestroyElement непосредственно отрывать свои слушатель:

willDestroyElement() { 
    Ember.$('window').off('resize'); 
    return this._super(...arguments); 
} 
+0

Не имеет значения –

0

Оказался, что willDestroyElement пожаров после того, как объект компоненты становится уничтожен (или ввод в разрушающем состоянии), так что если мой обработчик события что-то с состоянием компонента, решением может быть проверка isDestroying и isDestroyed флажков.