From 557f683c40e4923e3c1ed9f87b5914e021ee6936 Mon Sep 17 00:00:00 2001 From: simonihmig Date: Tue, 23 Apr 2019 00:42:57 +0200 Subject: [PATCH 1/2] Add failing test for attributes not available in didRender --- .../angle-bracket-invocation-test.js | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/tests/integration/components/angle-bracket-invocation-test.js b/tests/integration/components/angle-bracket-invocation-test.js index 4da0a1c..165ed71 100644 --- a/tests/integration/components/angle-bracket-invocation-test.js +++ b/tests/integration/components/angle-bracket-invocation-test.js @@ -476,5 +476,81 @@ module('Integration | Component | angle-bracket-invocation', function(hooks) { assert.dom('span').hasAttribute('data-right', 'right-inner'); }); } + + test('attributes are available in didInsertElement and didRender - normal component', async function(assert) { + assert.expect(6); + this.owner.register( + 'template:components/foo-bar', + hbs`hi martin!` + ); + this.owner.register( + 'component:foo-bar', + Component.extend({ + didInsertElement() { + assert.dom('span').hasAttribute('data-test-inner'); + assert.dom('span').hasAttribute('data-test-outer'); + }, + didRender() { + assert.dom('span').hasAttribute('data-test-inner'); + assert.dom('span').hasAttribute('data-test-outer'); + }, + }) + ); + + await render(hbs``); + + assert.dom('span').hasAttribute('data-test-inner'); + assert.dom('span').hasAttribute('data-test-outer'); + }); + + test('attributes are available in didInsertElement and didRender - tagless component', async function(assert) { + assert.expect(6); + this.owner.register( + 'template:components/foo-bar', + hbs`hi martin!` + ); + this.owner.register( + 'component:foo-bar', + Component.extend({ + tagName: '', + didInsertElement() { + assert.dom('span').hasAttribute('data-test-inner'); + assert.dom('span').hasAttribute('data-test-outer'); + }, + didRender() { + assert.dom('span').hasAttribute('data-test-inner'); + assert.dom('span').hasAttribute('data-test-outer'); + }, + }) + ); + + await render(hbs``); + + assert.dom('span').hasAttribute('data-test-inner'); + assert.dom('span').hasAttribute('data-test-outer'); + }); + + // This is just to confirm the semantics of dIE and dR, that attributes are applied when these hooks are called. See tests above! + test('attributes are available in didInsertElement and didRender - curly component', async function(assert) { + assert.expect(3); + this.owner.register('template:components/foo-bar', hbs`hi martin!`); + this.owner.register( + 'component:foo-bar', + Component.extend({ + tagName: 'span', + attributeBindings: ['data-test-outer'], + didInsertElement() { + assert.dom('span').hasAttribute('data-test-outer'); + }, + didRender() { + assert.dom('span').hasAttribute('data-test-outer'); + }, + }) + ); + + await render(hbs`{{foo-bar data-test-outer=true}}`); + + assert.dom('span').hasAttribute('data-test-outer'); + }); }); }); From 6e3fd7f4806ed87f6ebd5c1ac911d164dee1589d Mon Sep 17 00:00:00 2001 From: simonihmig Date: Sun, 5 May 2019 22:27:10 +0200 Subject: [PATCH 2/2] Override environment.transaction.commit to process modifiers before components --- .../runtime-polyfill.js | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/vendor/angle-bracket-invocation-polyfill/runtime-polyfill.js b/vendor/angle-bracket-invocation-polyfill/runtime-polyfill.js index 40b0ae5..2004481 100644 --- a/vendor/angle-bracket-invocation-polyfill/runtime-polyfill.js +++ b/vendor/angle-bracket-invocation-polyfill/runtime-polyfill.js @@ -402,6 +402,54 @@ import { lte, gte } from 'ember-compatibility-helpers'; return definition; }; + // process modifiers before components to fix https://github.com/rwjblue/ember-angle-bracket-invocation-polyfill/issues/64 + function _commit() { + let { scheduledInstallManagers, scheduledInstallModifiers } = this; + + for (let i = 0; i < scheduledInstallManagers.length; i++) { + let manager = scheduledInstallManagers[i]; + let modifier = scheduledInstallModifiers[i]; + manager.install(modifier); + } + + let { scheduledUpdateModifierManagers, scheduledUpdateModifiers } = this; + + for (let i = 0; i < scheduledUpdateModifierManagers.length; i++) { + let manager = scheduledUpdateModifierManagers[i]; + let modifier = scheduledUpdateModifiers[i]; + manager.update(modifier); + } + + let { createdComponents, createdManagers } = this; + + for (let i = 0; i < createdComponents.length; i++) { + let component = createdComponents[i]; + let manager = createdManagers[i]; + manager.didCreate(component); + } + + let { updatedComponents, updatedManagers } = this; + + for (let i = 0; i < updatedComponents.length; i++) { + let component = updatedComponents[i]; + let manager = updatedManagers[i]; + manager.didUpdate(component); + } + + let { destructors } = this; + + for (let i = 0; i < destructors.length; i++) { + destructors[i].destroy(); + } + } + + environment.commit = function() { + let transaction = this.transaction; + this._transaction = null; + + _commit.call(transaction); + }; + return environment; }; Environment.create.__IS_ANGLE_BRACKET_PATCHED__ = true;