Skip to content

Commit 9899dff

Browse files
committed
[CLEANUP beta] Remove ArrayController
Support for legacy array controller lives in the addon detected via duck typing. Also added inline comment where some functionality was extracted into the addon
1 parent fb49fa0 commit 9899dff

File tree

33 files changed

+159
-1406
lines changed

33 files changed

+159
-1406
lines changed

packages/ember-application/lib/ext/controller.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ ControllerMixin.reopen({
8484
For example, when you define a controller:
8585
8686
```javascript
87-
App.CommentsController = Ember.ArrayController.extend({
87+
App.CommentsController = Ember.Controller.extend({
8888
needs: ['post']
8989
});
9090
```
@@ -165,7 +165,7 @@ ControllerMixin.reopen({
165165
property will be accessible by name through this property.
166166
167167
```javascript
168-
App.CommentsController = Ember.ArrayController.extend({
168+
App.CommentsController = Ember.Controller.extend({
169169
needs: ['post'],
170170
postTitle: function() {
171171
var currentPost = this.get('controllers.post'); // instance of App.PostController

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import DefaultResolver from 'ember-application/system/resolver';
1515
import run from 'ember-metal/run_loop';
1616
import { canInvoke } from 'ember-metal/utils';
1717
import Controller from 'ember-runtime/controllers/controller';
18-
import ArrayController from 'ember-runtime/controllers/array_controller';
1918
import Renderer from 'ember-metal-views/renderer';
2019
import DOMHelper from 'ember-htmlbars/system/dom-helper';
2120
import SelectView from 'ember-views/views/select';
@@ -1015,7 +1014,6 @@ Application.reopenClass({
10151014
registry.register('application:main', namespace, { instantiate: false });
10161015

10171016
registry.register('controller:basic', Controller, { instantiate: false });
1018-
registry.register('controller:array', ArrayController, { instantiate: false });
10191017

10201018
registry.register('renderer:-dom', { create() { return new Renderer(new DOMHelper()); } });
10211019

packages/ember-application/tests/system/controller_test.js

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import 'ember-application/ext/controller';
55

66
import { Registry } from 'ember-runtime/system/container';
77
import { A } from 'ember-runtime/system/native_array';
8-
import ArrayController, { arrayControllerDeprecation } from 'ember-runtime/controllers/array_controller';
98
import { computed } from 'ember-metal/computed';
109

1110
QUnit.module('Controller dependencies');
@@ -58,26 +57,24 @@ QUnit.test('If a controller specifies an unavailable dependency, it raises', fun
5857
});
5958

6059
QUnit.test('Mixin sets up controllers if there is needs before calling super', function() {
61-
expectDeprecation(arrayControllerDeprecation);
6260
var registry = new Registry();
6361
var container = registry.container();
6462

65-
registry.register('controller:other', ArrayController.extend({
63+
registry.register('controller:other', Controller.extend({
6664
needs: 'posts',
6765
model: computed.alias('controllers.posts')
6866
}));
6967

70-
registry.register('controller:another', ArrayController.extend({
68+
registry.register('controller:another', Controller.extend({
7169
needs: 'posts',
7270
modelBinding: 'controllers.posts'
7371
}));
7472

75-
registry.register('controller:posts', ArrayController.extend());
73+
registry.register('controller:posts', Controller.extend());
7674

7775
container.lookup('controller:posts').set('model', A(['a', 'b', 'c']));
78-
79-
deepEqual(['a', 'b', 'c'], container.lookup('controller:other').toArray());
80-
deepEqual(['a', 'b', 'c'], container.lookup('controller:another').toArray());
76+
deepEqual(['a', 'b', 'c'], container.lookup('controller:other').get('model.model').toArray());
77+
deepEqual(['a', 'b', 'c'], container.lookup('controller:another').get('model.model').toArray());
8178
});
8279

8380
QUnit.test('raises if trying to get a controller that was not pre-defined in `needs`', function() {

packages/ember-htmlbars/lib/keywords/each.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
@submodule ember-htmlbars
44
*/
55

6-
import ArrayController from 'ember-runtime/controllers/array_controller';
7-
86
export default function each(morph, env, scope, params, hash, template, inverse, visitor) {
97
let getValue = env.hooks.getValue;
10-
let firstParam = params[0] && getValue(params[0]);
118
let keyword = hash['-legacy-keyword'] && getValue(hash['-legacy-keyword']);
129

13-
if (firstParam && firstParam instanceof ArrayController) {
10+
/* START: Support of legacy ArrayController. TODO: Remove after 1st 2.0 TLS release */
11+
let firstParam = params[0] && getValue(params[0]);
12+
if (firstParam && firstParam._isArrayController) {
1413
env.hooks.block(morph, env, scope, '-legacy-each-with-controller', params, hash, template, inverse, visitor);
1514
return true;
1615
}
16+
/* END: Support of legacy ArrayController */
1717

1818
if (keyword) {
1919
env.hooks.block(morph, env, scope, '-legacy-each-with-keyword', params, hash, template, inverse, visitor);

packages/ember-htmlbars/tests/helpers/each_test.js

Lines changed: 0 additions & 202 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,10 @@ import EmberObject from 'ember-runtime/system/object';
44
import run from 'ember-metal/run_loop';
55
import EmberView from 'ember-views/views/view';
66
import LegacyEachView from 'ember-views/views/legacy_each_view';
7-
import { computed } from 'ember-metal/computed';
8-
import ArrayController, { arrayControllerDeprecation } from 'ember-runtime/controllers/array_controller';
97
import { A } from 'ember-runtime/system/native_array';
108
import EmberController from 'ember-runtime/controllers/controller';
119
import { Registry } from 'ember-runtime/system/container';
1210

13-
import { get } from 'ember-metal/property_get';
1411
import { set } from 'ember-metal/property_set';
1512
import { runAppend, runDestroy } from 'ember-runtime/tests/utils';
1613

@@ -331,81 +328,6 @@ QUnit.test('it works inside a table element', function() {
331328
runDestroy(tableView);
332329
});
333330

334-
QUnit.test('it supports itemController', function() {
335-
var Controller = EmberController.extend({
336-
controllerName: computed(function() {
337-
return `controller:${this.get('model.name')}`;
338-
})
339-
});
340-
341-
runDestroy(view);
342-
343-
var parentController = {
344-
container: container
345-
};
346-
347-
registry.register('controller:array', ArrayController.extend());
348-
349-
view = EmberView.create({
350-
container: container,
351-
template: compile('{{#each view.people itemController="person"}}{{controllerName}}{{/each}}'),
352-
people: people,
353-
controller: parentController
354-
});
355-
356-
registry.register('controller:person', Controller);
357-
358-
runAppend(view);
359-
360-
equal(view.$().text(), 'controller:Steve Holtcontroller:Annabelle');
361-
362-
run(function() {
363-
view.rerender();
364-
});
365-
366-
assertText(view, 'controller:Steve Holtcontroller:Annabelle');
367-
368-
run(function() {
369-
people.pushObject({ name: 'Yehuda Katz' });
370-
});
371-
372-
assertText(view, 'controller:Steve Holtcontroller:Annabellecontroller:Yehuda Katz');
373-
374-
run(function() {
375-
set(view, 'people', A([{ name: 'Trek Glowacki' }, { name: 'Geoffrey Grosenbach' }]));
376-
});
377-
378-
assertText(view, 'controller:Trek Glowackicontroller:Geoffrey Grosenbach');
379-
380-
strictEqual(view.childViews[0].get('_arrayController.target'), parentController, 'the target property of the child controllers are set correctly');
381-
});
382-
383-
QUnit.test('itemController should not affect the DOM structure', function() {
384-
var Controller = EmberController.extend({
385-
name: computed.alias('model.name')
386-
});
387-
388-
runDestroy(view);
389-
390-
registry.register('controller:array', ArrayController.extend());
391-
392-
view = EmberView.create({
393-
container: container,
394-
template: compile(
395-
'<div id="a">{{#each view.people itemController="person" as |person|}}{{person.name}}{{/each}}</div>' +
396-
'<div id="b">{{#each view.people as |person|}}{{person.name}}{{/each}}</div>'
397-
),
398-
people: people
399-
});
400-
401-
registry.register('controller:person', Controller);
402-
403-
runAppend(view);
404-
405-
equal(view.$('#a').html(), view.$('#b').html());
406-
});
407-
408-
409331
QUnit.test('it supports {{itemView=}}', function() {
410332
var itemView = EmberView.extend({
411333
template: compile('itemView:{{name}}')
@@ -715,25 +637,6 @@ QUnit.test('it can move to and from {{else}} properly when the backing array gai
715637
assertHTML(view, 'Nothing');
716638
});
717639

718-
QUnit.test('it works with the controller keyword', function() {
719-
runDestroy(view);
720-
721-
var controller = ArrayController.create({
722-
model: A(['foo', 'bar', 'baz'])
723-
});
724-
725-
runDestroy(view);
726-
view = EmberView.create({
727-
container: container,
728-
controller: controller,
729-
template: compile('{{#view}}{{#each controller}}{{this}}{{/each}}{{/view}}')
730-
});
731-
732-
runAppend(view);
733-
734-
equal(view.$().text(), 'foobarbaz');
735-
});
736-
737640
QUnit.test('views inside #each preserve the new context [DEPRECATED]', function() {
738641
runDestroy(view);
739642

@@ -875,23 +778,6 @@ function testEachWithItem(moduleName, useBlockParams) {
875778
});
876779
}
877780

878-
QUnit.test('controller is assignable inside an #each', function() {
879-
expectDeprecation(arrayControllerDeprecation);
880-
var controller = ArrayController.create({
881-
model: A([{ name: 'Adam' }, { name: 'Steve' }])
882-
});
883-
884-
view = EmberView.create({
885-
container: container,
886-
controller: controller,
887-
template: templateFor('{{#EACH|this|personController}}{{#view controller=personController}}{{name}}{{/view}}{{/each}}', useBlockParams)
888-
});
889-
890-
runAppend(view);
891-
892-
equal(view.$().text(), 'AdamSteve');
893-
});
894-
895781
QUnit.test('it doesn\'t assert when the morph tags have the same parent', function() {
896782
view = EmberView.create({
897783
controller: A(['Cyril', 'David']),
@@ -903,94 +789,6 @@ function testEachWithItem(moduleName, useBlockParams) {
903789
ok(true, 'No assertion from valid template');
904790
});
905791

906-
QUnit.test('itemController specified in template with name binding does not change context [DEPRECATED]', function() {
907-
var Controller = EmberController.extend({
908-
controllerName: computed(function() {
909-
return `controller:${this.get('model.name')}`;
910-
})
911-
});
912-
913-
registry = new Registry();
914-
registry.register('view:-legacy-each', LegacyEachView);
915-
container = registry.container();
916-
917-
people = A([{ name: 'Steve Holt' }, { name: 'Annabelle' }]);
918-
919-
var parentController = {
920-
container: container,
921-
people: people,
922-
controllerName: 'controller:parentController'
923-
};
924-
925-
registry.register('controller:array', ArrayController.extend());
926-
927-
var template;
928-
expectDeprecation(function() {
929-
template = templateFor('{{#EACH|people|person|itemController="person"}}{{controllerName}} - {{person.controllerName}} - {{/each}}', useBlockParams);
930-
}, /Using 'itemController' with '{{each}}'/);
931-
932-
view = EmberView.create({
933-
template,
934-
container: container,
935-
controller: parentController
936-
});
937-
938-
registry.register('controller:person', Controller);
939-
940-
runAppend(view);
941-
942-
equal(view.$().text(), 'controller:parentController - controller:Steve Holt - controller:parentController - controller:Annabelle - ');
943-
944-
run(function() {
945-
people.pushObject({ name: 'Yehuda Katz' });
946-
});
947-
948-
assertText(view, 'controller:parentController - controller:Steve Holt - controller:parentController - controller:Annabelle - controller:parentController - controller:Yehuda Katz - ');
949-
950-
run(function() {
951-
set(parentController, 'people', A([{ name: 'Trek Glowacki' }, { name: 'Geoffrey Grosenbach' }]));
952-
});
953-
954-
assertText(view, 'controller:parentController - controller:Trek Glowacki - controller:parentController - controller:Geoffrey Grosenbach - ');
955-
956-
strictEqual(view.childViews[0].get('_arrayController.target'), parentController, 'the target property of the child controllers are set correctly');
957-
});
958-
959-
QUnit.test('itemController specified in ArrayController with name binding does not change context', function() {
960-
expectDeprecation(arrayControllerDeprecation);
961-
people = A([{ name: 'Steve Holt' }, { name: 'Annabelle' }]);
962-
963-
var PersonController = EmberController.extend({
964-
controllerName: computed(function() {
965-
return 'controller:' + get(this, 'model.name') + ' of ' + get(this, 'parentController.company');
966-
})
967-
});
968-
var PeopleController = ArrayController.extend({
969-
model: people,
970-
itemController: 'person',
971-
company: 'Yapp',
972-
controllerName: 'controller:people'
973-
});
974-
registry = new Registry();
975-
registry.register('view:-legacy-each', LegacyEachView);
976-
container = registry.container();
977-
978-
registry.register('controller:people', PeopleController);
979-
registry.register('controller:person', PersonController);
980-
981-
view = EmberView.create({
982-
container: container,
983-
template: templateFor('{{#EACH|this|person}}{{controllerName}} - {{person.controllerName}} - {{/each}}', useBlockParams),
984-
controller: container.lookup('controller:people')
985-
});
986-
987-
988-
runAppend(view);
989-
990-
equal(view.$().text(), 'controller:people - controller:Steve Holt of Yapp - controller:people - controller:Annabelle of Yapp - ');
991-
});
992-
993-
994792
QUnit.test('locals in stable loops update when the list is updated', function() {
995793
expect(3);
996794

0 commit comments

Comments
 (0)