Skip to content
This repository was archived by the owner on Feb 21, 2024. It is now read-only.

Commit a82aafd

Browse files
committed
unsubscribe events
1 parent 86382dc commit a82aafd

File tree

5 files changed

+59
-13
lines changed

5 files changed

+59
-13
lines changed

addon/components/wait-for-render.js

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import Ember from 'ember';
22
import layout from '../templates/components/wait-for-render';
33
import { EVENT_NAME } from '../mixins/wait-for-render';
44

5+
const { subscribe, unsubscribe } = Ember.Instrumentation;
6+
57
/**
68
* Defer component render until route has been rendered.
79
* Route must implement 'wait-for-render' mixin.
@@ -63,6 +65,16 @@ export default Ember.Component.extend({
6365
*/
6466
loading: null,
6567

68+
/**
69+
* Stores component instrumentation object.
70+
*
71+
* @property _subscriber
72+
* @type Object
73+
* @default null
74+
* @public
75+
*/
76+
_subscriber: null,
77+
6678
/**
6779
* Subscribe to route events.
6880
*
@@ -72,10 +84,12 @@ export default Ember.Component.extend({
7284
didInsertElement: function didInsertElement() {
7385
this._super(...arguments);
7486

75-
Ember.subscribe(`${EVENT_NAME}.${this.get('for')}`, {
87+
const subscriber = subscribe(`${EVENT_NAME}.${this.get('for')}`, {
7688
before: Ember.K,
7789
after: () => this._render()
7890
});
91+
92+
this.set('_subscriber', subscriber);
7993
},
8094

8195
/**
@@ -90,8 +104,16 @@ export default Ember.Component.extend({
90104
}
91105

92106
this.set('_rendered', true);
107+
},
108+
109+
/**
110+
* Destroy instrumentation binding.
111+
*
112+
* @method willDestroyElement
113+
* @private
114+
*/
115+
willDestroyElement() {
116+
unsubscribe(this.get('_subscriber'));
93117
}
94118

95-
}).reopenClass({
96-
positionalParams: ['for']
97119
});

addon/mixins/wait-for-render.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import Ember from 'ember';
22

3+
const { instrument } = Ember.Instrumentation;
4+
35
export const EVENT_NAME = 'wait-for-render';
46

57
export default Ember.Mixin.create({
@@ -18,7 +20,7 @@ export default Ember.Mixin.create({
1820
// Defer to the next cycle to allow a browser render
1921
Ember.run.next(this, () => {
2022
// Send a signal when template is fully rendered
21-
Ember.instrument(`${EVENT_NAME}.${this.routeName}`, () => {
23+
instrument(`${EVENT_NAME}.${this.routeName}`, () => {
2224
// Set a flag for debugging purposes
2325
this.set('_rendered', true);
2426
});

bower.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
{
22
"name": "ember-wait-for-render",
33
"dependencies": {
4-
"ember": "~2.8.0",
4+
"ember": "~1.13.0",
55
"ember-cli-shims": "0.1.1"
6+
},
7+
"resolutions": {
8+
"ember": "~1.13.0"
69
}
7-
}
10+
}

tests/integration/components/wait-for-render-test.js

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { moduleForComponent, test } from 'ember-qunit';
33
import hbs from 'htmlbars-inline-precompile';
44
import { EVENT_NAME } from 'ember-wait-for-render/mixins/wait-for-render';
55

6+
const { instrument } = Ember.Instrumentation;
7+
68
moduleForComponent('wait-for-render', 'Integration | Component | wait for render', {
79
integration: true
810
});
@@ -17,17 +19,32 @@ test('it does not renders the content', function(assert) {
1719
assert.equal(this.$().text().trim(), '');
1820
});
1921

20-
test('it renders the content when signal has been triggered', function(assert) {
22+
test('it renders the content when route is ready', function(assert) {
2123
const content = 'foo';
2224

2325
this.set('content', content);
2426
this.render(hbs`{{#wait-for-render}}{{content}}{{/wait-for-render}}`);
2527

2628
Ember.run(() => {
27-
Ember.instrument(`${EVENT_NAME}.foo`, () => {
28-
assert.ok(1);
29-
});
29+
instrument(`${EVENT_NAME}.*`, Ember.K);
30+
});
31+
32+
Ember.run(() => {
33+
assert.equal(this.$().text().trim(), content);
34+
});
35+
});
36+
37+
test('it renders the content when specific route is ready', function(assert) {
38+
const content = 'foo';
39+
40+
this.set('content', content);
41+
this.render(hbs`{{#wait-for-render for=content}}{{content}}{{/wait-for-render}}`);
42+
43+
Ember.run(() => {
44+
instrument(`${EVENT_NAME}.${content}`, Ember.K);
3045
});
3146

32-
assert.equal(this.$().text().trim(), content);
47+
Ember.run(() => {
48+
assert.equal(this.$().text().trim(), content);
49+
});
3350
});

tests/unit/mixins/wait-for-render-test.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import WaitForRenderMixin from 'ember-wait-for-render/mixins/wait-for-render';
33
import { EVENT_NAME } from 'ember-wait-for-render/mixins/wait-for-render';
44
import { module, test } from 'qunit';
55

6+
const { subscribe } = Ember.Instrumentation;
7+
68
module('Unit | Mixin | wait for render');
79

810
test('it works in a Route object', function(assert) {
@@ -32,7 +34,7 @@ test('it does not works if object is not a Route', function(assert) {
3234
routeName
3335
});
3436

35-
Ember.subscribe(`${EVENT_NAME}.${routeName}`, {
37+
subscribe(`${EVENT_NAME}.${routeName}`, {
3638
before: () => assert.ok(1),
3739
after: () => {
3840
assert.ok(1);
@@ -53,7 +55,7 @@ test('it toggles \'_rendered\' property', function(assert) {
5355
routeName
5456
});
5557

56-
Ember.subscribe(`${EVENT_NAME}.${routeName}`, {
58+
subscribe(`${EVENT_NAME}.${routeName}`, {
5759
before: () => Ember.K,
5860
after: () => {
5961
assert.ok(subject.get('_rendered'));

0 commit comments

Comments
 (0)