Skip to content

Commit 2a233df

Browse files
author
Robert Jackson
committed
Use the renderer to manage the view registry.
* Remove usage of `Ember.View.views`. This has not been exposed since 1.x. * Use the renderer to update view registry.
1 parent 52ba7d0 commit 2a233df

File tree

17 files changed

+60
-125
lines changed

17 files changed

+60
-125
lines changed

packages/ember-application/lib/system/application.js

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import Namespace, {
1212
} from 'ember-runtime/system/namespace';
1313
import { runLoadHooks } from 'ember-runtime/system/lazy_load';
1414
import run from 'ember-metal/run_loop';
15-
import EmberView from 'ember-views/views/view';
1615
import EventDispatcher from 'ember-views/system/event_dispatcher';
1716
import jQuery from 'ember-views/system/jquery';
1817
import Route from 'ember-routing/system/route';
@@ -403,10 +402,10 @@ const Application = Engine.extend({
403402
404403
This is orthogonal to autoboot: the deprecated instance needs to
405404
be created at Application construction (not boot) time to expose
406-
App.__container__ and the global Ember.View.views registry. If
407-
autoboot sees that this instance exists, it will continue booting
408-
it to avoid doing unncessary work (as opposed to building a new
409-
instance at boot time), but they are otherwise unrelated.
405+
App.__container__. If autoboot sees that this instance exists,
406+
it will continue booting it to avoid doing unncessary work (as
407+
opposed to building a new instance at boot time), but they are
408+
otherwise unrelated.
410409
411410
@private
412411
@method _buildDeprecatedInstance
@@ -419,10 +418,6 @@ const Application = Engine.extend({
419418
// on App that rely on a single, default instance.
420419
this.__deprecatedInstance__ = instance;
421420
this.__container__ = instance.__container__;
422-
423-
// For the default instance only, set the view registry to the global
424-
// Ember.View.views hash for backwards-compatibility.
425-
EmberView.views = instance.lookup('-view-registry:main');
426421
},
427422

428423
/**

packages/ember-application/lib/system/engine.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,8 @@ function commonSetupRegistry(registry) {
487487
registry.injection('service:-dom-helper', 'document', 'service:-document');
488488

489489
registry.injection('view', '_viewRegistry', '-view-registry:main');
490+
registry.injection('renderer', '_viewRegistry', '-view-registry:main');
491+
registry.injection('event_dispatcher:main', '_viewRegistry', '-view-registry:main');
490492

491493
registry.injection('route', '_topLevelViewTemplate', 'template:-outlet');
492494

packages/ember-glimmer/lib/component.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import AriaRoleSupport from 'ember-views/mixins/aria_role_support';
77
import ViewMixin from 'ember-views/mixins/view_support';
88
import ActionSupport from 'ember-views/mixins/action_support';
99
import TargetActionSupport from 'ember-runtime/mixins/target_action_support';
10-
import EmberView from 'ember-views/views/view';
1110
import symbol from 'ember-metal/symbol';
1211
import EmptyObject from 'ember-metal/empty_object';
1312
import { get } from 'ember-metal/property_get';
@@ -48,7 +47,6 @@ const Component = CoreView.extend(
4847

4948
init() {
5049
this._super(...arguments);
51-
this._viewRegistry = this._viewRegistry || EmberView.views;
5250
this[DIRTY_TAG] = new DirtyableTag();
5351
this[ROOT_REF] = null;
5452
this[REFS] = new EmptyObject();

packages/ember-glimmer/lib/renderer.js

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { RootReference } from './utils/references';
22
import run from 'ember-metal/run_loop';
33
import { setHasViews } from 'ember-metal/tags';
44
import { CURRENT_TAG, UNDEFINED_REFERENCE } from 'glimmer-reference';
5+
import fallbackViewRegistry from 'ember-views/compat/fallback-view-registry';
6+
import { assert } from 'ember-metal/debug';
57

68
const { backburner } = run;
79

@@ -115,12 +117,13 @@ class Scheduler {
115117
}
116118

117119
class Renderer {
118-
constructor({ dom, env, destinedForDOM = false }) {
120+
constructor({ dom, env, _viewRegistry, destinedForDOM = false }) {
119121
this._root = null;
120122
this._dom = dom;
121123
this._env = env;
122124
this._destinedForDOM = destinedForDOM;
123125
this._scheduler = new Scheduler();
126+
this._viewRegistry = _viewRegistry || fallbackViewRegistry;
124127
}
125128

126129
destroy() {
@@ -209,16 +212,25 @@ class Renderer {
209212
// TODO: Implement this
210213
// throw new Error('Something you did caused a view to re-render after it rendered but before it was inserted into the DOM.');
211214
}
215+
216+
_register(view) {
217+
assert('Attempted to register a view with an id already in use: ' + view.elementId, !this._viewRegistry[this.elementId]);
218+
this._viewRegistry[view.elementId] = view;
219+
}
220+
221+
_unregister(view) {
222+
delete this._viewRegistry[this.elementId];
223+
}
212224
}
213225

214226
export const InertRenderer = {
215-
create({ dom, env }) {
216-
return new Renderer({ dom, env, destinedForDOM: false });
227+
create({ dom, env, _viewRegistry }) {
228+
return new Renderer({ dom, env, _viewRegistry, destinedForDOM: false });
217229
}
218230
};
219231

220232
export const InteractiveRenderer = {
221-
create({ dom, env }) {
222-
return new Renderer({ dom, env, destinedForDOM: true });
233+
create({ dom, env, _viewRegistry }) {
234+
return new Renderer({ dom, env, _viewRegistry, destinedForDOM: true });
223235
}
224236
};

packages/ember-glimmer/tests/integration/components/curly-components-test.js

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1968,54 +1968,6 @@ moduleFor('Components test: curly components', class extends RenderingTest {
19681968
assert.equal(outer.parentView, this.context, 'x-outer receives the ambient scope as its parentView');
19691969
}
19701970

1971-
['@htmlbars component should receive the viewRegistry from the parentView'](assert) {
1972-
let outer, innerTemplate, innerLayout;
1973-
1974-
let viewRegistry = {};
1975-
1976-
this.registerComponent('x-outer', {
1977-
ComponentClass: Component.extend({
1978-
init() {
1979-
this._super(...arguments);
1980-
outer = this;
1981-
}
1982-
}),
1983-
template: '{{x-inner-in-layout}}{{yield}}'
1984-
});
1985-
1986-
this.registerComponent('x-inner-in-template', {
1987-
ComponentClass: Component.extend({
1988-
init() {
1989-
this._super(...arguments);
1990-
innerTemplate = this;
1991-
}
1992-
})
1993-
});
1994-
1995-
this.registerComponent('x-inner-in-layout', {
1996-
ComponentClass: Component.extend({
1997-
init() {
1998-
this._super(...arguments);
1999-
innerLayout = this;
2000-
}
2001-
})
2002-
});
2003-
2004-
this.render('{{#x-outer}}{{x-inner-in-template}}{{/x-outer}}', {
2005-
_viewRegistry: viewRegistry
2006-
});
2007-
2008-
assert.equal(innerTemplate._viewRegistry, viewRegistry);
2009-
assert.equal(innerLayout._viewRegistry, viewRegistry);
2010-
assert.equal(outer._viewRegistry, viewRegistry);
2011-
2012-
this.runTask(() => this.rerender());
2013-
2014-
assert.equal(innerTemplate._viewRegistry, viewRegistry);
2015-
assert.equal(innerLayout._viewRegistry, viewRegistry);
2016-
assert.equal(outer._viewRegistry, viewRegistry);
2017-
}
2018-
20191971
['@htmlbars component should rerender when a property is changed during children\'s rendering'](assert) {
20201972
expectDeprecation(/modified value twice in a single render/);
20211973

packages/ember-glimmer/tests/utils/abstract-test-case.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ export class AbstractRenderingTest extends TestCase {
319319
this.component = null;
320320

321321
owner.register('event_dispatcher:main', EventDispatcher);
322+
owner.inject('event_dispatcher:main', '_viewRegistry', '-view-registry:main');
322323
owner.lookup('event_dispatcher:main').setup(this.getCustomDispatcherEvents(), owner.element);
323324
}
324325

packages/ember-glimmer/tests/utils/helpers.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ export function buildOwner(options) {
2323
owner.inject('service:-dom-helper', 'document', 'service:-document');
2424
owner.inject('component', 'renderer', 'renderer:-dom');
2525
owner.inject('template', 'env', 'service:-glimmer-environment');
26+
27+
owner.register('-view-registry:main', { create() { return {}; } });
28+
owner.inject('renderer', '_viewRegistry', '-view-registry:main');
29+
2630
return owner;
2731
}
28-

packages/ember-htmlbars/lib/node-managers/component-node-manager.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,6 @@ export function createComponent(_component, props, renderNode, env, attrs = {})
169169

170170
setOwner(props, env.owner);
171171
props.renderer = props.parentView ? props.parentView.renderer : env.owner.lookup('renderer:-dom');
172-
props._viewRegistry = props.parentView ? props.parentView._viewRegistry : env.owner.lookup('-view-registry:main');
173172

174173
let component = _component.create(props);
175174

packages/ember-htmlbars/lib/node-managers/view-node-manager.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,6 @@ export function createOrUpdateComponent(component, options, createOptions, rende
191191

192192
setOwner(props, owner);
193193
props.renderer = options.parentView ? options.parentView.renderer : owner && owner.lookup('renderer:-dom');
194-
props._viewRegistry = options.parentView ? options.parentView._viewRegistry : owner && owner.lookup('-view-registry:main');
195194

196195
if (proto.controller !== defaultController || hasSuppliedController) {
197196
delete props._context;

packages/ember-htmlbars/lib/renderer.js

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ import buildComponentTemplate from 'ember-htmlbars/system/build-component-templa
77
import { environment } from 'ember-environment';
88
import { internal } from 'htmlbars-runtime';
99
import { renderHTMLBarsBlock } from 'ember-htmlbars/system/render-view';
10+
import fallbackViewRegistry from 'ember-views/compat/fallback-view-registry';
11+
import { assert } from 'ember-metal/debug';
1012

11-
export function Renderer(domHelper, { destinedForDOM } = {}) {
13+
export function Renderer(domHelper, { destinedForDOM, _viewRegistry } = {}) {
1214
this._dom = domHelper;
1315

1416
// This flag indicates whether the resulting rendered element will be
@@ -20,6 +22,8 @@ export function Renderer(domHelper, { destinedForDOM } = {}) {
2022
this._destinedForDOM = destinedForDOM === undefined ?
2123
environment.hasDOM :
2224
destinedForDOM;
25+
26+
this._viewRegistry = _viewRegistry || fallbackViewRegistry;
2327
}
2428

2529
Renderer.prototype.prerenderTopLevelView =
@@ -281,14 +285,24 @@ Renderer.prototype.didDestroyElement = function (view) {
281285
}
282286
};
283287

288+
289+
Renderer.prototype._register = function Renderer_register(view) {
290+
assert('Attempted to register a view with an id already in use: ' + view.elementId, !this._viewRegistry[this.elementId]);
291+
this._viewRegistry[view.elementId] = view;
292+
};
293+
294+
Renderer.prototype._unregister = function Renderer_unregister(view) {
295+
delete this._viewRegistry[this.elementId];
296+
};
297+
284298
export const InertRenderer = {
285-
create({ dom }) {
286-
return new Renderer(dom, { destinedForDOM: false });
299+
create({ dom, _viewRegistry }) {
300+
return new Renderer(dom, { destinedForDOM: false, _viewRegistry });
287301
}
288302
};
289303

290304
export const InteractiveRenderer = {
291-
create({ dom }) {
292-
return new Renderer(dom, { destinedForDOM: true });
305+
create({ dom, _viewRegistry }) {
306+
return new Renderer(dom, { destinedForDOM: true, _viewRegistry });
293307
}
294308
};

0 commit comments

Comments
 (0)