diff --git a/packages/ember-htmlbars/lib/hooks/get-root.js b/packages/ember-htmlbars/lib/hooks/get-root.js index 1fdadddca05..503aa7632a3 100644 --- a/packages/ember-htmlbars/lib/hooks/get-root.js +++ b/packages/ember-htmlbars/lib/hooks/get-root.js @@ -30,12 +30,12 @@ function getKey(scope, key) { var self = scope.self || scope.locals.view; - if (scope.attrs && key in scope.attrs) { + if (self) { + return self.getKey(key); + } else if (scope.attrs && key in scope.attrs) { // TODO: attrs // Ember.deprecate("You accessed the `" + key + "` attribute directly. Please use `attrs." + key + "` instead."); return scope.attrs[key]; - } else if (self) { - return self.getKey(key); } } diff --git a/packages/ember-htmlbars/lib/templates/legacy-each.hbs b/packages/ember-htmlbars/lib/templates/legacy-each.hbs index 855c568f53d..d748541852f 100644 --- a/packages/ember-htmlbars/lib/templates/legacy-each.hbs +++ b/packages/ember-htmlbars/lib/templates/legacy-each.hbs @@ -1,5 +1,5 @@ -{{~#each view._arrangedContent -legacy-keyword=keyword as |item|~}} - {{~#if keyword}} +{{~#each view._arrangedContent -legacy-keyword=view.keyword as |item|~}} + {{~#if view.keyword}} {{~#if attrs.itemViewClass~}} {{~#view attrs.itemViewClass _defaultTagName=view._itemTagName~}} {{~legacy-yield item~}} diff --git a/packages/ember-htmlbars/tests/integration/attrs_lookup_test.js b/packages/ember-htmlbars/tests/integration/attrs_lookup_test.js new file mode 100644 index 00000000000..2a0b2283c1e --- /dev/null +++ b/packages/ember-htmlbars/tests/integration/attrs_lookup_test.js @@ -0,0 +1,84 @@ +import Registry from 'container/registry'; +import compile from 'ember-template-compiler/system/compile'; +import ComponentLookup from 'ember-views/component_lookup'; +import Component from 'ember-views/views/component'; +import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; +import EmberView from 'ember-views/views/view'; + +var registry, container, view; + +QUnit.module('component - attrs lookup', { + setup() { + registry = new Registry(); + container = registry.container(); + registry.optionsForType('component', { singleton: false }); + registry.optionsForType('view', { singleton: false }); + registry.optionsForType('template', { instantiate: false }); + registry.register('component-lookup:main', ComponentLookup); + }, + + teardown() { + runDestroy(container); + runDestroy(view); + registry = container = view = null; + } +}); + +QUnit.test('should be able to lookup attrs without `attrs.` - template access', function() { + registry.register('template:components/foo-bar', compile('{{first}}')); + + view = EmberView.extend({ + template: compile('{{foo-bar first="first attr"}}'), + container: container + }).create(); + + runAppend(view); + + equal(view.$().text(), 'first attr'); +}); + +QUnit.test('should be able to lookup attrs without `attrs.` - component access', function() { + var component; + + registry.register('component:foo-bar', Component.extend({ + init() { + this._super(...arguments); + component = this; + } + })); + + view = EmberView.extend({ + template: compile('{{foo-bar first="first attr"}}'), + container: container + }).create(); + + runAppend(view); + + equal(component.get('first'), 'first attr'); +}); + +QUnit.test('should be able to modify a provided attr into local state #11571 / #11559', function() { + var component; + + registry.register('component:foo-bar', Component.extend({ + init() { + this._super(...arguments); + component = this; + }, + + didReceiveAttrs() { + this.set('first', this.getAttr('first').toUpperCase()); + } + })); + registry.register('template:components/foo-bar', compile('{{first}}')); + + view = EmberView.extend({ + template: compile('{{foo-bar first="first attr"}}'), + container: container + }).create(); + + runAppend(view); + + equal(view.$().text(), 'FIRST ATTR', 'template lookup uses local state'); + equal(component.get('first'), 'FIRST ATTR', 'component lookup uses local state'); +});