Skip to content

Commit

Permalink
[GLIMMER] Ensure all components have injections.
Browse files Browse the repository at this point in the history
Prior to this change we were defaulting to `Ember.Component` which does
not receive injections (which meant it was missing the `renderer`).
This worked "ok" in HTMLBars since we created a default global renderer
to handle components/views without a container/owner.

This change ensures that in the template only component case we fall
back to using the default component looked up from the owner. This
ensures that injections are present.
  • Loading branch information
Robert Jackson committed Aug 27, 2016
1 parent 3de2360 commit 831c8cb
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 8 deletions.
2 changes: 1 addition & 1 deletion packages/ember-glimmer/lib/environment.js
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ export default class Environment extends GlimmerEnvironment {
let name = path[0];
let blockMeta = symbolTable.getMeta();
let owner = blockMeta.owner;
let source = `template:${blockMeta.moduleName}`;
let source = blockMeta.moduleName && `template:${blockMeta.moduleName}`;

return this._definitionCache.get({ name, source, owner });
}
Expand Down
2 changes: 2 additions & 0 deletions packages/ember-glimmer/lib/setup-registry.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import TextField from './components/text_field';
import TextArea from './components/text_area';
import Checkbox from './components/checkbox';
import LinkToComponent from './components/link-to';
import Component from './component';
import ComponentTemplate from './templates/component';
import RootTemplate from './templates/root';
import OutletTemplate from './templates/outlet';
Expand Down Expand Up @@ -50,4 +51,5 @@ export function setupEngineRegistry(registry) {
registry.register('component:-text-area', TextArea);
registry.register('component:-checkbox', Checkbox);
registry.register('component:link-to', LinkToComponent);
registry.register(P`component:-default`, Component);
}
3 changes: 1 addition & 2 deletions packages/ember-glimmer/lib/syntax/curly-component.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import assign from 'ember-metal/assign';
import get from 'ember-metal/property_get';
import { _instrumentStart } from 'ember-metal/instrumentation';
import { ComponentDefinition } from 'glimmer-runtime';
import Component from '../component';
import { OWNER } from 'container/owner';

const DEFAULT_LAYOUT = P`template:components/-default`;
Expand Down Expand Up @@ -369,7 +368,7 @@ function ariaRole(vm) {

export class CurlyComponentDefinition extends ComponentDefinition {
constructor(name, ComponentClass, template, args) {
super(name, MANAGER, ComponentClass || Component);
super(name, MANAGER, ComponentClass);
this.template = template;
this.args = args;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,18 @@ moduleFor('Components test: curly components', class extends RenderingTest {
this.assertComponentElement(this.firstChild, { content: 'hello' });
}

['@test it can render a template only component']() {
this.registerComponent('foo-bar', { template: 'hello' });

this.render('{{foo-bar}}');

this.assertComponentElement(this.firstChild, { content: 'hello' });

this.runTask(() => this.rerender());

this.assertComponentElement(this.firstChild, { content: 'hello' });
}

['@test it can have a custom id and it is not bound']() {
this.registerComponent('foo-bar', { template: '{{id}} {{elementId}}' });

Expand Down
5 changes: 4 additions & 1 deletion packages/ember-htmlbars/lib/setup-registry.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import { privatize as P } from 'container/registry';
import { InteractiveRenderer, InertRenderer } from 'ember-htmlbars/renderer';
import HTMLBarsDOMHelper from 'ember-htmlbars/system/dom-helper';
import topLevelViewTemplate from 'ember-htmlbars/templates/top-level-view';
import { OutletView as HTMLBarsOutletView } from 'ember-htmlbars/views/outlet';
import EmberView from 'ember-views/views/view';
import Component from 'ember-htmlbars/component';
import TextField from 'ember-htmlbars/components/text_field';
import TextArea from 'ember-htmlbars/components/text_area';
import Checkbox from 'ember-htmlbars/components/checkbox';
import LinkToComponent from 'ember-htmlbars/components/link-to';
import TemplateSupport from 'ember-views/mixins/template_support';


export function setupApplicationRegistry(registry) {
registry.register('renderer:-dom', InteractiveRenderer);
registry.register('renderer:-inert', InertRenderer);
Expand All @@ -32,4 +33,6 @@ export function setupEngineRegistry(registry) {
registry.register('component:-text-area', TextArea);
registry.register('component:-checkbox', Checkbox);
registry.register('component:link-to', LinkToComponent);

registry.register(P`component:-default`, Component);
}
14 changes: 10 additions & 4 deletions packages/ember-views/lib/utils/lookup-component.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
import { privatize as P } from 'container/registry';

function lookupComponentPair(componentLookup, owner, name, options) {
let component = componentLookup.componentFor(name, owner, options);
let layout = componentLookup.layoutFor(name, owner, options);
return {
component,
layout
};

let result = { layout, component };

if (layout && !component) {
result.component = owner._lookupFactory(P`component:-default`);
}

return result;
}

export default function lookupComponent(owner, name, options) {
Expand Down

0 comments on commit 831c8cb

Please sign in to comment.