From 06bdaa99dada257591624be5aebb81b07b6e039c Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 12 Nov 2017 15:55:02 -0500 Subject: [PATCH] check component exists after _bind before continuing - fixes #917 --- src/shared/index.js | 9 ++++-- .../Nested.html | 1 + .../_config.js | 29 +++++++++++++++++++ .../main.html | 14 +++++++++ 4 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 test/runtime/samples/component-binding-self-destroying/Nested.html create mode 100644 test/runtime/samples/component-binding-self-destroying/_config.js create mode 100644 test/runtime/samples/component-binding-self-destroying/main.html diff --git a/src/shared/index.js b/src/shared/index.js index d55e55c22b..f9d0f91998 100644 --- a/src/shared/index.js +++ b/src/shared/index.js @@ -156,9 +156,12 @@ export function _set(newState) { this._state = assign({}, oldState, newState); this._recompute(changed, this._state); if (this._bind) this._bind(changed, this._state); - dispatchObservers(this, this._observers.pre, changed, this._state, oldState); - this._fragment.p(changed, this._state); - dispatchObservers(this, this._observers.post, changed, this._state, oldState); + + if (this._fragment) { + dispatchObservers(this, this._observers.pre, changed, this._state, oldState); + this._fragment.p(changed, this._state); + dispatchObservers(this, this._observers.post, changed, this._state, oldState); + } } export function _setDev(newState) { diff --git a/test/runtime/samples/component-binding-self-destroying/Nested.html b/test/runtime/samples/component-binding-self-destroying/Nested.html new file mode 100644 index 0000000000..3fb5ca4da3 --- /dev/null +++ b/test/runtime/samples/component-binding-self-destroying/Nested.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/runtime/samples/component-binding-self-destroying/_config.js b/test/runtime/samples/component-binding-self-destroying/_config.js new file mode 100644 index 0000000000..e1d61c733a --- /dev/null +++ b/test/runtime/samples/component-binding-self-destroying/_config.js @@ -0,0 +1,29 @@ +export default { + solo: true, + + data: { + show: true + }, + + html: ` + + `, + + test(assert, component, target, window) { + const click = new window.MouseEvent('click'); + + target.querySelector('button').dispatchEvent(click); + + assert.equal(component.get('show'), false); + assert.htmlEqual(target.innerHTML, ` + + `); + + target.querySelector('button').dispatchEvent(click); + + assert.equal(component.get('show'), true); + assert.htmlEqual(target.innerHTML, ` + + `); + } +}; diff --git a/test/runtime/samples/component-binding-self-destroying/main.html b/test/runtime/samples/component-binding-self-destroying/main.html new file mode 100644 index 0000000000..74fa144d02 --- /dev/null +++ b/test/runtime/samples/component-binding-self-destroying/main.html @@ -0,0 +1,14 @@ +{{#if show}} + +{{else}} + +{{/if}} + + \ No newline at end of file