Skip to content

Commit

Permalink
Completely remove the concept of isVirtual
Browse files Browse the repository at this point in the history
MetamorphView (and the Metamorph mixin) are the final bastion of
virtual views. This commit removes much of their use.

MetamorphView had two behaviors: First, it was tagless. Second, it was
not included in the view hierarchy. The first concept (taglessness) is
still valid in Ember post-Glimmer. For this, we use `tagName: ''`.

The second concept (virtual views) is not longer present. So views which
previously used MetamorphView will not longer be able to escape the view
hierarchy. In most cases, the intent was likely to be tagless and being
virtual was simply a side effect.

OutletView and EachView will now be present in childViews and will be
parentViews.

`{{render` used to always create a view. Now, it will only create a view
if one is set by the user. By default it is only a componentNode and has
no view at all.

The final spot MetamorphViews are used it for the default itemView and
emptyView on EachView. This should be easy to address in a manner
similar to {{render: If the user does not specify a view, none should be
required.

After this, MetamorphView will no longer be used by internals.
  • Loading branch information
mixonic authored and rwjblue committed Apr 18, 2015
1 parent e697ef3 commit 113e0a7
Show file tree
Hide file tree
Showing 22 changed files with 196 additions and 113 deletions.
2 changes: 0 additions & 2 deletions packages/ember-application/lib/system/application.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import DOMHelper from "ember-htmlbars/system/dom-helper";
import SelectView from "ember-views/views/select";
import { OutletView } from "ember-routing-views/views/outlet";
import EmberView from "ember-views/views/view";
import _MetamorphView from "ember-views/views/metamorph_view";
import EventDispatcher from "ember-views/system/event_dispatcher";
import jQuery from "ember-views/system/jquery";
import Route from "ember-routing/system/route";
Expand Down Expand Up @@ -1014,7 +1013,6 @@ Application.reopenClass({

registry.injection('view', '_viewRegistry', '-view-registry:main');

registry.register('view:default', _MetamorphView);
registry.register('view:toplevel', EmberView.extend());

registry.register('route:basic', Route, { instantiate: false });
Expand Down
4 changes: 1 addition & 3 deletions packages/ember-htmlbars/lib/system/component-node.js
Original file line number Diff line number Diff line change
Expand Up @@ -164,10 +164,8 @@ export function createOrUpdateComponent(component, options, renderNode, env, att
if (options.parentView) {
options.parentView.appendChild(component);

// don't set the property on a virtual view, as they are invisible to
// consumers of the view API
if (options.viewName) {
set(get(options.parentView, 'concreteView'), options.viewName, component);
set(options.parentView, options.viewName, component);
}
}

Expand Down
2 changes: 0 additions & 2 deletions packages/ember-htmlbars/tests/compat/handlebars_get_test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import Ember from "ember-metal/core"; // Ember.lookup
import _MetamorphView from "ember-views/views/metamorph_view";
import EmberView from "ember-views/views/view";
import handlebarsGet from "ember-htmlbars/compat/handlebars-get";
import { Registry } from "ember-runtime/system/container";
Expand All @@ -19,7 +18,6 @@ QUnit.module("ember-htmlbars: compat - Ember.Handlebars.get", {
container = registry.container();
registry.optionsForType('template', { instantiate: false });
registry.optionsForType('helper', { instantiate: false });
registry.register('view:default', _MetamorphView);
registry.register('view:toplevel', EmberView.extend());
},

Expand Down
2 changes: 0 additions & 2 deletions packages/ember-htmlbars/tests/helpers/bind_attr_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import Ember from "ember-metal/core"; // Ember.lookup
import run from "ember-metal/run_loop";
import Namespace from "ember-runtime/system/namespace";
import EmberView from "ember-views/views/view";
import _MetamorphView from "ember-views/views/metamorph_view";
import EmberObject from "ember-runtime/system/object";
import { A } from "ember-runtime/system/native_array";
import { computed } from "ember-metal/computed";
Expand Down Expand Up @@ -35,7 +34,6 @@ QUnit.module("ember-htmlbars: {{bind-attr}} [DEPRECATED]", {
registry = new Registry();
container = registry.container();
registry.optionsForType('template', { instantiate: false });
registry.register('view:default', _MetamorphView);
registry.register('view:toplevel', EmberView.extend());

warnings = [];
Expand Down
1 change: 0 additions & 1 deletion packages/ember-htmlbars/tests/helpers/collection_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ QUnit.module("collection helper", {
container = registry.container();

registry.optionsForType('template', { instantiate: false });
// registry.register('view:default', _MetamorphView);
registry.register('view:toplevel', EmberView.extend());
},

Expand Down
8 changes: 0 additions & 8 deletions packages/ember-htmlbars/tests/helpers/each_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ import Ember from "ember-metal/core"; // Ember.lookup;
import EmberObject from "ember-runtime/system/object";
import run from "ember-metal/run_loop";
import EmberView from "ember-views/views/view";
import _MetamorphView from "ember-views/views/metamorph_view";
import LegacyEachView from "ember-views/views/legacy_each_view";
import { computed } from "ember-metal/computed";
import ArrayController from "ember-runtime/controllers/array_controller";
import { A } from "ember-runtime/system/native_array";
Expand Down Expand Up @@ -88,7 +86,6 @@ QUnit.module("the #each helper [DEPRECATED]", {
registry = new Registry();
container = registry.container();

registry.register('view:default', _MetamorphView);
registry.register('view:toplevel', EmberView.extend());
registry.register('view:-legacy-each', LegacyEachView);

Expand Down Expand Up @@ -574,8 +571,6 @@ QUnit.test("it supports {{itemViewClass=}} with tagName (DEPRECATED)", function(
container: container
});

//expectDeprecation(/Supplying a tagName to Metamorph views is unreliable and is deprecated./);

runAppend(view);
equal(view.$('ul').length, 1, 'rendered ul tag');
equal(view.$('ul li').length, 2, 'rendered 2 li tags');
Expand Down Expand Up @@ -681,8 +676,6 @@ QUnit.test("it supports {{emptyViewClass=}} with tagName (DEPRECATED)", function
container: container
});

//expectDeprecation(/Supplying a tagName to Metamorph views is unreliable and is deprecated./);

runAppend(view);

equal(view.$('b').length, 1, 'rendered b tag');
Expand Down Expand Up @@ -796,7 +789,6 @@ function testEachWithItem(moduleName, useBlockParams) {
registry = new Registry();
container = registry.container();

registry.register('view:default', _MetamorphView);
registry.register('view:toplevel', EmberView.extend());
},
teardown() {
Expand Down
2 changes: 0 additions & 2 deletions packages/ember-htmlbars/tests/helpers/if_unless_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import { Registry } from "ember-runtime/system/container";
import EmberView from "ember-views/views/view";
import ObjectProxy from "ember-runtime/system/object_proxy";
import EmberObject from "ember-runtime/system/object";
import _MetamorphView from 'ember-views/views/metamorph_view';
import compile from "ember-template-compiler/system/compile";

import { set } from 'ember-metal/property_set';
Expand All @@ -24,7 +23,6 @@ QUnit.module("ember-htmlbars: {{#if}} and {{#unless}} helpers", {
registry = new Registry();
container = registry.container();
registry.optionsForType('template', { instantiate: false });
registry.register('view:default', _MetamorphView);
registry.register('view:toplevel', EmberView.extend());
},

Expand Down
2 changes: 0 additions & 2 deletions packages/ember-htmlbars/tests/helpers/view_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import TextField from 'ember-views/views/text_field';
import Namespace from 'ember-runtime/system/namespace';
import EmberObject from 'ember-runtime/system/object';
import ContainerView from 'ember-views/views/container_view';
import _MetamorphView from 'ember-views/views/metamorph_view';
import SafeString from 'htmlbars-util/safe-string';
import precompile from 'ember-template-compiler/compat/precompile';
import compile from "ember-template-compiler/system/compile";
Expand Down Expand Up @@ -49,7 +48,6 @@ QUnit.module("ember-htmlbars: {{#view}} helper", {
container = registry.container();
registry.optionsForType('template', { instantiate: false });
registry.optionsForType('helper', { instantiate: false });
registry.register('view:default', _MetamorphView);
registry.register('view:toplevel', EmberView.extend());
},

Expand Down
2 changes: 0 additions & 2 deletions packages/ember-htmlbars/tests/integration/with_view_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import jQuery from 'ember-views/system/jquery';
import EmberView from 'ember-views/views/view';
import { Registry } from "ember-runtime/system/container";
import EmberObject from 'ember-runtime/system/object';
import _MetamorphView from 'ember-views/views/metamorph_view';
import compile from 'ember-template-compiler/system/compile';
import { runAppend, runDestroy } from "ember-runtime/tests/utils";

Expand All @@ -17,7 +16,6 @@ QUnit.module('ember-htmlbars: {{#with}} and {{#view}} integration', {
registry = new Registry();
container = registry.container();
registry.optionsForType('template', { instantiate: false });
registry.register('view:default', _MetamorphView);
registry.register('view:toplevel', EmberView.extend());
},

Expand Down
38 changes: 28 additions & 10 deletions packages/ember-routing-htmlbars/lib/keywords/render.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Ember from "ember-metal/core"; // assert
import { get } from "ember-metal/property_get";
import EmberError from "ember-metal/error";
import create from 'ember-metal/platform/create';
import { isStream, read } from "ember-metal/streams/utils";
Expand Down Expand Up @@ -49,6 +50,12 @@ export default {
var context = params[1];

var container = env.container;

// The render keyword presumes it can work without a router. This is really
// only to satisfy the test:
//
// {{view}} should not override class bindings defined on a child view"
//
var router = container.lookup('router:main');

Ember.assert(
Expand All @@ -61,7 +68,7 @@ export default {
Ember.assert(
"You can only use the {{render}} helper once without a model object as " +
"its second argument, as in {{render \"post\" post}}.",
!router || !router._lookupActiveView(name)
!router || !router._lookupActiveComponentNode(name)
);
} else if (params.length !== 2) {
throw new EmberError("You must pass a templateName to render");
Expand All @@ -81,9 +88,15 @@ export default {
var view = container.lookup('view:' + name);
if (!view) {
view = container.lookup('view:default');
template = template || container.lookup(templateName);
}
view.ownerView = env.view.ownerView;
var viewHasTemplateSpecified = view && !!get(view, 'template');
if (!template && !viewHasTemplateSpecified) {
template = container.lookup(templateName);
}

if (view) {
view.ownerView = env.view.ownerView;
}

// provide controller override
var controllerName;
Expand Down Expand Up @@ -129,30 +142,35 @@ export default {
});
}

view.set('controller', controller);
if (view) {
view.set('controller', controller);
}
state.controller = controller;

hash.viewName = camelize(name);

if (router && params.length === 1) {
router._connectActiveView(name, view);
}


// var state = node.state;
// var parentView = scope.view;
if (template && template.raw) {
template = template.raw;
}

var options = {
component: view,
layout: null,
self: controller
};

if (view) {
options.component = view;
}

var componentNode = ComponentNode.create(node, env, hash, options, state.parentView, null, null, template);
state.componentNode = componentNode;

if (router && params.length === 1) {
router._connectActiveComponentNode(name, componentNode);
}

componentNode.render(env, hash, visitor);
},

Expand Down
Loading

0 comments on commit 113e0a7

Please sign in to comment.