1

所以我有 jquery 事件处理程序附加到window,我在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");

我想我需要在运行中包装一些东西,但是什么?尝试了许多似乎有意义但没有奏效的方法。

4

2 回答 2

1

不要使用直接.on使用该willDestroyElement方法来分离你的听众:

willDestroyElement() {
  Ember.$('window').off('resize');
  return this._super(...arguments);
}
于 2016-08-09T07:43:36.487 回答
0

结果是willDestroyElement在组件的对象被破坏(或进入破坏状态)后触发,所以如果我的事件处理程序对组件的状态做了一些事情,解决方案可能也是检查 isDestroyingisDestroyed标记。

于 2016-08-09T14:58:05.350 回答