dist/ember.prod.js in ember-source-2.9.0.beta.4 vs dist/ember.prod.js in ember-source-2.9.0.beta.5

- old
+ new

@@ -4,11 +4,11 @@ * @copyright Copyright 2011-2016 Tilde Inc. and contributors * Portions Copyright 2006-2011 Strobe Inc. * Portions Copyright 2008-2011 Apple Inc. All rights reserved. * @license Licensed under MIT license * See https://raw.github.com/emberjs/ember.js/master/LICENSE - * @version 2.9.0-beta.4 + * @version 2.9.0-beta.5 */ var enifed, requireModule, require, Ember; var mainContext = this; @@ -6500,11 +6500,12 @@ @public */ Component[_emberMetal.NAME_KEY] = 'Ember.Component'; Component.reopenClass({ - isComponentFactory: true + isComponentFactory: true, + positionalParams: [] }); exports.default = Component; }); @@ -7942,12 +7943,10 @@ exports.default = Environment; }); enifed('ember-glimmer/helper', ['exports', 'ember-utils', 'ember-runtime', 'glimmer-reference'], function (exports, _emberUtils, _emberRuntime, _glimmerReference) { 'use strict'; - var _EmberObject$extend; - exports.helper = helper; var RECOMPUTE_TAG = _emberUtils.symbol('RECOMPUTE_TAG'); exports.RECOMPUTE_TAG = RECOMPUTE_TAG; /** @@ -7988,27 +7987,53 @@ @class Ember.Helper @public @since 1.13.0 */ - var Helper = _emberRuntime.Object.extend((_EmberObject$extend = { - isHelperInstance: true + var Helper = _emberRuntime.FrameworkObject.extend({ + isHelperInstance: true, - }, _EmberObject$extend[_emberRuntime.POST_INIT] = function () { - this[RECOMPUTE_TAG] = new _glimmerReference.DirtyableTag(); - }, _EmberObject$extend.recompute = function () { - this[RECOMPUTE_TAG].dirty(); - }, _EmberObject$extend)); + init: function () { + this._super.apply(this, arguments); + this[RECOMPUTE_TAG] = new _glimmerReference.DirtyableTag(); + }, - /** - Override this function when writing a class-based helper. - @method compute - @param {Array} params The positional arguments to the helper - @param {Object} hash The named arguments to the helper - @public - @since 1.13.0 - */ + /** + On a class-based helper, it may be useful to force a recomputation of that + helpers value. This is akin to `rerender` on a component. + For example, this component will rerender when the `currentUser` on a + session service changes: + ```js + // app/helpers/current-user-email.js + export default Ember.Helper.extend({ + session: Ember.inject.service(), + onNewUser: Ember.observer('session.currentUser', function() { + this.recompute(); + }), + compute() { + return this.get('session.currentUser.email'); + } + }); + ``` + @method recompute + @public + @since 1.13.0 + */ + recompute: function () { + this[RECOMPUTE_TAG].dirty(); + } + + /** + Override this function when writing a class-based helper. + @method compute + @param {Array} params The positional arguments to the helper + @param {Object} hash The named arguments to the helper + @public + @since 1.13.0 + */ + }); + Helper.reopenClass({ isHelperFactory: true }); /** @@ -8039,32 +8064,10 @@ }; } exports.default = Helper; }); - -/** - On a class-based helper, it may be useful to force a recomputation of that - helpers value. This is akin to `rerender` on a component. - For example, this component will rerender when the `currentUser` on a - session service changes: - ```js - // app/helpers/current-user-email.js - export default Ember.Helper.extend({ - session: Ember.inject.service(), - onNewUser: Ember.observer('session.currentUser', function() { - this.recompute(); - }), - compute() { - return this.get('session.currentUser.email'); - } - }); - ``` - @method recompute - @public - @since 1.13.0 -*/ enifed('ember-glimmer/helpers/-class', ['exports', 'ember-glimmer/utils/references', 'ember-runtime'], function (exports, _emberGlimmerUtilsReferences, _emberRuntime) { 'use strict'; function classHelper(_ref) { var positional = _ref.positional; @@ -8153,13 +8156,15 @@ enifed('ember-glimmer/helpers/action', ['exports', 'ember-utils', 'ember-glimmer/utils/references', 'ember-metal'], function (exports, _emberUtils, _emberGlimmerUtilsReferences, _emberMetal) { 'use strict'; exports.createClosureAction = createClosureAction; var INVOKE = _emberUtils.symbol('INVOKE'); - exports.INVOKE = INVOKE; + var ACTION = _emberUtils.symbol('ACTION'); + exports.ACTION = ACTION; + var ClosureActionReference = (function (_CachedReference) { babelHelpers.inherits(ClosureActionReference, _CachedReference); ClosureActionReference.create = function create(args) { // TODO: Const reference optimization. @@ -8286,10 +8291,11 @@ return _emberMetal.run.join.apply(_emberMetal.run, [target, action].concat(args)); }); }; } + closureAction[ACTION] = true; return closureAction; } }); enifed('ember-glimmer/helpers/component', ['exports', 'ember-utils', 'ember-glimmer/utils/references', 'ember-glimmer/syntax/curly-component', 'glimmer-runtime', 'ember-metal'], function (exports, _emberUtils, _emberGlimmerUtilsReferences, _emberGlimmerSyntaxCurlyComponent, _glimmerRuntime, _emberMetal) { 'use strict'; @@ -9689,19 +9695,10 @@ Renderer.prototype.rerender = function rerender(view) { this._scheduleRevalidate(); }; - Renderer.prototype.componentInitAttrs = function componentInitAttrs() { - // TODO: Remove me - }; - - Renderer.prototype.ensureViewNotRendering = function ensureViewNotRendering() { - // TODO: Implement this - // throw new Error('Something you did caused a view to re-render after it rendered but before it was inserted into the DOM.'); - }; - Renderer.prototype.register = function register(view) { var id = _emberViews.getViewId(view); this._viewRegistry[id] = view; }; @@ -9827,10 +9824,12 @@ // globalShouldReflush should be `true` if *any* of // the roots need to reflush globalShouldReflush = globalShouldReflush || shouldReflush; } + this._lastRevision = _glimmerReference.CURRENT_TAG.value(); + env.commit(); } while (globalShouldReflush || roots.length > initialRootsLength); // remove any roots that were destroyed during this transaction while (removedRoots.length) { @@ -9854,14 +9853,18 @@ // used to prevent calling _renderRoots again (see above) // while we are actively rendering roots this._isRenderingRoots = true; + var completedWithoutError = false; try { this._renderRoots(); + completedWithoutError = true; } finally { - this._lastRevision = _glimmerReference.CURRENT_TAG.value(); + if (!completedWithoutError) { + this._lastRevision = _glimmerReference.CURRENT_TAG.value(); + } this._isRenderingRoots = false; } }; Renderer.prototype._clearAllRoots = function _clearAllRoots() { @@ -10230,12 +10233,18 @@ } component.trigger('didInitAttrs', { attrs: attrs }); component.trigger('didReceiveAttrs', { newAttrs: attrs }); - if (environment.isInteractive) { - component.trigger('willRender'); + // We usually do this in the `didCreateElement`, but that hook doesn't fire for tagless components + if (component.tagName === '') { + component._transitionTo('hasElement'); + + if (environment.isInteractive) { + component.trigger('willInsertElement'); + component.trigger('willRender'); + } } var bucket = new ComponentStateBucket(environment, component, processedArgs, finalizer); if (args.named.has('class')) { @@ -10315,10 +10324,11 @@ component._transitionTo('hasElement'); if (environment.isInteractive) { component.trigger('willInsertElement'); + component.trigger('willRender'); } }; CurlyComponentManager.prototype.didRenderLayout = function didRenderLayout(bucket, bounds) { bucket.component[_emberGlimmerComponent.BOUNDS] = bounds; @@ -10413,12 +10423,18 @@ dynamicScope.view = component; component.trigger('didInitAttrs'); component.trigger('didReceiveAttrs'); - if (environment.isInteractive) { - component.trigger('willRender'); + // We usually do this in the `didCreateElement`, but that hook doesn't fire for tagless components + if (component.tagName === '') { + component._transitionTo('hasElement'); + + if (environment.isInteractive) { + component.trigger('willInsertElement'); + component.trigger('willRender'); + } } processComponentInitializationAssertions(component, {}); return new ComponentStateBucket(environment, component, args, finalizer); @@ -11244,10 +11260,21 @@ function referenceForKey(component, key) { return component[_emberGlimmerComponent.ROOT_REF].get(key); } function referenceForParts(component, parts) { + var isAttrs = parts[0] === 'attrs'; + + // TODO deprecate this + if (isAttrs) { + parts.shift(); + + if (parts.length === 1) { + return referenceForKey(component, parts[0]); + } + } + return _glimmerReference.referenceFromParts(component[_emberGlimmerComponent.ROOT_REF], parts); } // TODO we should probably do this transform at build time @@ -11751,11 +11778,11 @@ }; return ArrayIterable; })(); }); -enifed('ember-glimmer/utils/process-args', ['exports', 'ember-utils', 'glimmer-reference', 'ember-glimmer/component', 'ember-glimmer/utils/references', 'ember-views'], function (exports, _emberUtils, _glimmerReference, _emberGlimmerComponent, _emberGlimmerUtilsReferences, _emberViews) { +enifed('ember-glimmer/utils/process-args', ['exports', 'ember-utils', 'glimmer-reference', 'ember-glimmer/component', 'ember-glimmer/utils/references', 'ember-views', 'ember-glimmer/helpers/action'], function (exports, _emberUtils, _glimmerReference, _emberGlimmerComponent, _emberGlimmerUtilsReferences, _emberViews, _emberGlimmerHelpersAction) { 'use strict'; exports.default = processArgs; function processArgs(args, positionalParamsDefinition) { @@ -11807,11 +11834,13 @@ for (var i = 0, l = keys.length; i < l; i++) { var _name = keys[i]; var ref = namedArgs.get(_name); var value = attrs[_name]; - if (ref[_emberGlimmerUtilsReferences.UPDATE]) { + if (typeof value === 'function' && value[_emberGlimmerHelpersAction.ACTION]) { + attrs[_name] = value; + } else if (ref[_emberGlimmerUtilsReferences.UPDATE]) { attrs[_name] = new MutableCell(ref, value); } args[_name] = ref; props[_name] = value; @@ -12130,10 +12159,14 @@ var parentValue = _parentReference.value(); _parentObjectTag.update(_emberMetal.tagFor(parentValue)); + if (typeof parentValue === 'string' && _propertyKey === 'length') { + return parentValue.length; + } + if (typeof parentValue === 'object' && parentValue) { if (false) { var meta = _emberMetal.meta(parentValue); _emberMetal.watchKey(parentValue, _propertyKey, meta); } @@ -19576,82 +19609,60 @@ } }); return properties; } }); -enifed('ember-metal/tags', ['exports', 'ember-metal/meta', 'require'], function (exports, _emberMetalMeta, _require2) { +enifed('ember-metal/tags', ['exports', 'glimmer-reference', 'ember-metal/meta', 'require'], function (exports, _glimmerReference, _emberMetalMeta, _require) { 'use strict'; exports.setHasViews = setHasViews; exports.tagFor = tagFor; + exports.markObjectAsDirty = markObjectAsDirty; - var hasGlimmer = _require2.has('glimmer-reference'); - - var CONSTANT_TAG = undefined, - CURRENT_TAG = undefined, - DirtyableTag = undefined, - makeTag = undefined, - run = undefined; - var hasViews = function () { return false; }; function setHasViews(fn) { hasViews = fn; } - var markObjectAsDirty = undefined; + function makeTag() { + return new _glimmerReference.DirtyableTag(); + } - exports.markObjectAsDirty = markObjectAsDirty; - function tagFor(object, _meta) { - if (!hasGlimmer) { - throw new Error('Cannot call tagFor without Glimmer'); - } - if (typeof object === 'object' && object) { var meta = _meta || _emberMetalMeta.meta(object); return meta.writableTag(makeTag); } else { - return CONSTANT_TAG; + return _glimmerReference.CONSTANT_TAG; } } + function markObjectAsDirty(meta) { + var tag = meta && meta.readableTag(); + + if (tag) { + ensureRunloop(); + tag.dirty(); + } + } + + var run = undefined; + function K() {} + function ensureRunloop() { if (!run) { - run = _require2.default('ember-metal/run_loop').default; + run = _require.default('ember-metal/run_loop').default; } if (hasViews() && !run.backburner.currentInstance) { run.schedule('actions', K); } } - - if (hasGlimmer) { - var _require = _require2.default('glimmer-reference'); - - DirtyableTag = _require.DirtyableTag; - CONSTANT_TAG = _require.CONSTANT_TAG; - CURRENT_TAG = _require.CURRENT_TAG; - - makeTag = function () { - return new DirtyableTag(); - }; - - exports.markObjectAsDirty = markObjectAsDirty = function (meta) { - var tag = meta && meta.readableTag(); - - if (tag) { - ensureRunloop(); - tag.dirty(); - } - }; - } else { - exports.markObjectAsDirty = markObjectAsDirty = function () {}; - } }); enifed("ember-metal/testing", ["exports"], function (exports) { "use strict"; exports.isTesting = isTesting; @@ -19730,11 +19741,11 @@ label = parts.join(); } else { label = 'the same value'; } - return 'You modified ' + parts.join('.') + ' twice in a single render. This was unreliable and slow in Ember 1.x and ' + implication; + return 'You modified ' + parts.join('.') + ' twice on ' + object + ' in a single render. This was unreliable and slow in Ember 1.x and ' + implication; })(), false); shouldReflush = true; } }; @@ -27690,10 +27701,11 @@ */ 'use strict'; exports.Object = _emberRuntimeSystemObject.default; + exports.FrameworkObject = _emberRuntimeSystemObject.FrameworkObject; exports.String = _emberRuntimeSystemString.default; exports.RegistryProxyMixin = _emberRuntimeMixinsRegistry_proxy.default; exports.buildFakeRegistryWithDeprecations = _emberRuntimeMixinsRegistry_proxy.buildFakeRegistryWithDeprecations; exports.ContainerProxyMixin = _emberRuntimeMixinsContainer_proxy.default; exports.copy = _emberRuntimeCopy.default; @@ -27710,11 +27722,10 @@ exports.isNamespaceSearchDisabled = _emberRuntimeSystemNamespace.isSearchDisabled; exports.setNamespaceSearchDisabled = _emberRuntimeSystemNamespace.setSearchDisabled; exports.ArrayProxy = _emberRuntimeSystemArray_proxy.default; exports.ObjectProxy = _emberRuntimeSystemObject_proxy.default; exports.CoreObject = _emberRuntimeSystemCore_object.default; - exports.POST_INIT = _emberRuntimeSystemCore_object.POST_INIT; exports.NativeArray = _emberRuntimeSystemNative_array.default; exports.A = _emberRuntimeSystemNative_array.A; exports.ActionHandler = _emberRuntimeMixinsAction_handler.default; exports.deprecateUnderscoreActions = _emberRuntimeMixinsAction_handler.deprecateUnderscoreActions; exports.Copyable = _emberRuntimeMixinsCopyable.default; @@ -27906,24 +27917,22 @@ } return a === b; } }); -enifed('ember-runtime/mixins/-proxy', ['exports', 'ember-utils', 'ember-metal', 'ember-runtime/computed/computed_macros', 'ember-runtime/system/core_object', 'require'], function (exports, _emberUtils, _emberMetal, _emberRuntimeComputedComputed_macros, _emberRuntimeSystemCore_object, _require2) { +enifed('ember-runtime/mixins/-proxy', ['exports', 'glimmer-reference', 'ember-utils', 'ember-metal', 'ember-runtime/computed/computed_macros'], function (exports, _glimmerReference, _emberUtils, _emberMetal, _emberRuntimeComputedComputed_macros) { /** @module ember @submodule ember-runtime */ 'use strict'; - var _PROXY_MIXIN_PROPS; + var _Mixin$create; exports.isProxy = isProxy; - var hasGlimmer = _require2.has('glimmer-reference'); - var IS_PROXY = _emberUtils.symbol('IS_PROXY'); function isProxy(value) { return typeof value === 'object' && value && value[IS_PROXY]; } @@ -27942,32 +27951,66 @@ return; } // if shadowed in proxy _emberMetal.propertyDidChange(this, key); } - /** - `Ember.ProxyMixin` forwards all properties not defined by the proxy itself - to a proxied `content` object. See Ember.ObjectProxy for more details. - - @class ProxyMixin - @namespace Ember - @private - */ - var PROXY_MIXIN_PROPS = (_PROXY_MIXIN_PROPS = {}, _PROXY_MIXIN_PROPS[IS_PROXY] = true, _PROXY_MIXIN_PROPS.content = null, _PROXY_MIXIN_PROPS._contentDidChange = _emberMetal.observer('content', function () {}), _PROXY_MIXIN_PROPS.isTruthy = _emberRuntimeComputedComputed_macros.bool('content'), _PROXY_MIXIN_PROPS._debugContainerKey = null, _PROXY_MIXIN_PROPS.willWatchProperty = function (key) { + var ProxyTag = (function (_CachedTag) { + babelHelpers.inherits(ProxyTag, _CachedTag); + + function ProxyTag(proxy) { + _CachedTag.call(this); + + var content = _emberMetal.get(proxy, 'content'); + + this.proxy = proxy; + this.proxyWrapperTag = new _glimmerReference.DirtyableTag(); + this.proxyContentTag = new _glimmerReference.UpdatableTag(_emberMetal.tagFor(content)); + } + + /** + `Ember.ProxyMixin` forwards all properties not defined by the proxy itself + to a proxied `content` object. See Ember.ObjectProxy for more details. + + @class ProxyMixin + @namespace Ember + @private + */ + + ProxyTag.prototype.compute = function compute() { + return Math.max(this.proxyWrapperTag.value(), this.proxyContentTag.value()); + }; + + ProxyTag.prototype.dirty = function dirty() { + this.proxyWrapperTag.dirty(); + }; + + ProxyTag.prototype.contentDidChange = function contentDidChange() { + var content = _emberMetal.get(this.proxy, 'content'); + this.proxyContentTag.update(_emberMetal.tagFor(content)); + }; + + return ProxyTag; + })(_glimmerReference.CachedTag); + + exports.default = _emberMetal.Mixin.create((_Mixin$create = {}, _Mixin$create[IS_PROXY] = true, _Mixin$create.content = null, _Mixin$create._initializeTag = _emberMetal.on('init', function () { + _emberMetal.meta(this)._tag = new ProxyTag(this); + }), _Mixin$create._contentDidChange = _emberMetal.observer('content', function () { + _emberMetal.tagFor(this).contentDidChange(); + }), _Mixin$create.isTruthy = _emberRuntimeComputedComputed_macros.bool('content'), _Mixin$create._debugContainerKey = null, _Mixin$create.willWatchProperty = function (key) { var contentKey = 'content.' + key; _emberMetal._addBeforeObserver(this, contentKey, null, contentPropertyWillChange); _emberMetal.addObserver(this, contentKey, null, contentPropertyDidChange); - }, _PROXY_MIXIN_PROPS.didUnwatchProperty = function (key) { + }, _Mixin$create.didUnwatchProperty = function (key) { var contentKey = 'content.' + key; _emberMetal._removeBeforeObserver(this, contentKey, null, contentPropertyWillChange); _emberMetal.removeObserver(this, contentKey, null, contentPropertyDidChange); - }, _PROXY_MIXIN_PROPS.unknownProperty = function (key) { + }, _Mixin$create.unknownProperty = function (key) { var content = _emberMetal.get(this, 'content'); if (content) { return _emberMetal.get(content, key); } - }, _PROXY_MIXIN_PROPS.setUnknownProperty = function (key, value) { + }, _Mixin$create.setUnknownProperty = function (key, value) { var m = _emberMetal.meta(this); if (m.proto === this) { // if marked as prototype then just defineProperty // rather than delegate _emberMetal.defineProperty(this, key, null, value); @@ -27975,56 +28018,11 @@ } var content = _emberMetal.get(this, 'content'); return _emberMetal.set(content, key, value); - }, _PROXY_MIXIN_PROPS); - - if (hasGlimmer) { - (function () { - var _require = _require2.default('glimmer-reference'); - - var CachedTag = _require.CachedTag; - var DirtyableTag = _require.DirtyableTag; - var UpdatableTag = _require.UpdatableTag; - - var ProxyTag = (function (_CachedTag) { - babelHelpers.inherits(ProxyTag, _CachedTag); - - function ProxyTag(proxy, content) { - _CachedTag.call(this); - this.proxyWrapperTag = new DirtyableTag(); - this.proxyContentTag = new UpdatableTag(_emberMetal.tagFor(content)); - } - - ProxyTag.prototype.compute = function compute() { - return Math.max(this.proxyWrapperTag.value(), this.proxyContentTag.value()); - }; - - ProxyTag.prototype.dirty = function dirty() { - this.proxyWrapperTag.dirty(); - }; - - ProxyTag.prototype.contentDidChange = function contentDidChange(content) { - this.proxyContentTag.update(_emberMetal.tagFor(content)); - }; - - return ProxyTag; - })(CachedTag); - - PROXY_MIXIN_PROPS[_emberRuntimeSystemCore_object.POST_INIT] = function postInit() { - this._super(); - _emberMetal.meta(this)._tag = new ProxyTag(this, _emberMetal.get(this, 'content')); - }; - - PROXY_MIXIN_PROPS._contentDidChange = _emberMetal.observer('content', function () { - _emberMetal.meta(this)._tag.contentDidChange(_emberMetal.get(this, 'content')); - }); - })(); - } - - exports.default = _emberMetal.Mixin.create(PROXY_MIXIN_PROPS); + }, _Mixin$create)); }); /** The object whose properties will be forwarded. @property content @@ -32322,14 +32320,10 @@ */ // using ember-metal/lib/main here to ensure that ember-debug is setup // if present - var _Mixin$create; - - var POST_INIT = _emberUtils.symbol('POST_INIT'); - exports.POST_INIT = POST_INIT; var schedule = _emberMetal.run.schedule; var applyMixin = _emberMetal.Mixin._apply; var finishPartial = _emberMetal.Mixin.finishPartial; var reopen = _emberMetal.Mixin.prototype.reopen; var hasCachedComputedProperties = false; @@ -32426,12 +32420,10 @@ finishPartial(this, m); this.init.apply(this, arguments); - this[POST_INIT](); - m.proto = proto; _emberMetal.finishChains(this); _emberMetal.sendEvent(this, 'init'); }; @@ -32472,11 +32464,11 @@ */ var CoreObject = makeCtor(); CoreObject.toString = function () { return 'Ember.CoreObject'; }; - CoreObject.PrototypeMixin = _emberMetal.Mixin.create((_Mixin$create = { + CoreObject.PrototypeMixin = _emberMetal.Mixin.create({ reopen: function () { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } @@ -32505,44 +32497,249 @@ do important setup work, and you'll see strange behavior in your application. @method init @public */ - init: function () {} + init: function () {}, - }, _Mixin$create[POST_INIT] = function () {}, _Mixin$create.__defineNonEnumerable = function (property) { - Object.defineProperty(this, property.name, property.descriptor); - //this[property.name] = property.descriptor.value; - }, _Mixin$create.concatenatedProperties = null, _Mixin$create.mergedProperties = null, _Mixin$create.isDestroyed = false, _Mixin$create.isDestroying = false, _Mixin$create.destroy = function () { - if (this.isDestroying) { - return; - } - this.isDestroying = true; + __defineNonEnumerable: function (property) { + Object.defineProperty(this, property.name, property.descriptor); + //this[property.name] = property.descriptor.value; + }, - schedule('actions', this, this.willDestroy); - schedule('destroy', this, this._scheduledDestroy); - return this; - }, _Mixin$create.willDestroy = function () {}, _Mixin$create._scheduledDestroy = function () { - if (this.isDestroyed) { - return; - } - _emberMetal.destroy(this); - this.isDestroyed = true; - }, _Mixin$create.bind = function (to, from) { - if (!(from instanceof _emberMetal.Binding)) { - from = _emberMetal.Binding.from(from); - } - from.to(to).connect(this); - return from; - }, _Mixin$create.toString = function () { - var hasToStringExtension = typeof this.toStringExtension === 'function'; - var extension = hasToStringExtension ? ':' + this.toStringExtension() : ''; - var ret = '<' + this.constructor.toString() + ':' + _emberUtils.guidFor(this) + extension + '>'; + /** + Defines the properties that will be concatenated from the superclass + (instead of overridden). + By default, when you extend an Ember class a property defined in + the subclass overrides a property with the same name that is defined + in the superclass. However, there are some cases where it is preferable + to build up a property's value by combining the superclass' property + value with the subclass' value. An example of this in use within Ember + is the `classNames` property of `Ember.View`. + Here is some sample code showing the difference between a concatenated + property and a normal one: + ```javascript + const Bar = Ember.Object.extend({ + // Configure which properties to concatenate + concatenatedProperties: ['concatenatedProperty'], + someNonConcatenatedProperty: ['bar'], + concatenatedProperty: ['bar'] + }); + const FooBar = Bar.extend({ + someNonConcatenatedProperty: ['foo'], + concatenatedProperty: ['foo'] + }); + let fooBar = FooBar.create(); + fooBar.get('someNonConcatenatedProperty'); // ['foo'] + fooBar.get('concatenatedProperty'); // ['bar', 'foo'] + ``` + This behavior extends to object creation as well. Continuing the + above example: + ```javascript + let fooBar = FooBar.create({ + someNonConcatenatedProperty: ['baz'], + concatenatedProperty: ['baz'] + }) + fooBar.get('someNonConcatenatedProperty'); // ['baz'] + fooBar.get('concatenatedProperty'); // ['bar', 'foo', 'baz'] + ``` + Adding a single property that is not an array will just add it in the array: + ```javascript + let fooBar = FooBar.create({ + concatenatedProperty: 'baz' + }) + view.get('concatenatedProperty'); // ['bar', 'foo', 'baz'] + ``` + Using the `concatenatedProperties` property, we can tell Ember to mix the + content of the properties. + In `Ember.Component` the `classNames`, `classNameBindings` and + `attributeBindings` properties are concatenated. + This feature is available for you to use throughout the Ember object model, + although typical app developers are likely to use it infrequently. Since + it changes expectations about behavior of properties, you should properly + document its usage in each individual concatenated property (to not + mislead your users to think they can override the property in a subclass). + @property concatenatedProperties + @type Array + @default null + @public + */ + concatenatedProperties: null, - return ret; - }, _Mixin$create)); + /** + Defines the properties that will be merged from the superclass + (instead of overridden). + By default, when you extend an Ember class a property defined in + the subclass overrides a property with the same name that is defined + in the superclass. However, there are some cases where it is preferable + to build up a property's value by merging the superclass property value + with the subclass property's value. An example of this in use within Ember + is the `queryParams` property of routes. + Here is some sample code showing the difference between a merged + property and a normal one: + ```javascript + const Bar = Ember.Object.extend({ + // Configure which properties are to be merged + mergedProperties: ['mergedProperty'], + someNonMergedProperty: { + nonMerged: 'superclass value of nonMerged' + }, + mergedProperty: { + page: {replace: false}, + limit: {replace: true} + } + }); + const FooBar = Bar.extend({ + someNonMergedProperty: { + completelyNonMerged: 'subclass value of nonMerged' + }, + mergedProperty: { + limit: {replace: false} + } + }); + let fooBar = FooBar.create(); + fooBar.get('someNonMergedProperty'); + // => { completelyNonMerged: 'subclass value of nonMerged' } + // + // Note the entire object, including the nonMerged property of + // the superclass object, has been replaced + fooBar.get('mergedProperty'); + // => { + // page: {replace: false}, + // limit: {replace: false} + // } + // + // Note the page remains from the superclass, and the + // `limit` property's value of `false` has been merged from + // the subclass. + ``` + This behavior is not available during object `create` calls. It is only + available at `extend` time. + In `Ember.Route` the `queryParams` property is merged. + This feature is available for you to use throughout the Ember object model, + although typical app developers are likely to use it infrequently. Since + it changes expectations about behavior of properties, you should properly + document its usage in each individual merged property (to not + mislead your users to think they can override the property in a subclass). + @property mergedProperties + @type Array + @default null + @public + */ + mergedProperties: null, + /** + Destroyed object property flag. + if this property is `true` the observers and bindings were already + removed by the effect of calling the `destroy()` method. + @property isDestroyed + @default false + @public + */ + isDestroyed: false, + + /** + Destruction scheduled flag. The `destroy()` method has been called. + The object stays intact until the end of the run loop at which point + the `isDestroyed` flag is set. + @property isDestroying + @default false + @public + */ + isDestroying: false, + + /** + Destroys an object by setting the `isDestroyed` flag and removing its + metadata, which effectively destroys observers and bindings. + If you try to set a property on a destroyed object, an exception will be + raised. + Note that destruction is scheduled for the end of the run loop and does not + happen immediately. It will set an isDestroying flag immediately. + @method destroy + @return {Ember.Object} receiver + @public + */ + destroy: function () { + if (this.isDestroying) { + return; + } + this.isDestroying = true; + + schedule('actions', this, this.willDestroy); + schedule('destroy', this, this._scheduledDestroy); + return this; + }, + + /** + Override to implement teardown. + @method willDestroy + @public + */ + willDestroy: function () {}, + + /** + Invoked by the run loop to actually destroy the object. This is + scheduled for execution by the `destroy` method. + @private + @method _scheduledDestroy + */ + _scheduledDestroy: function () { + if (this.isDestroyed) { + return; + } + _emberMetal.destroy(this); + this.isDestroyed = true; + }, + + bind: function (to, from) { + if (!(from instanceof _emberMetal.Binding)) { + from = _emberMetal.Binding.from(from); + } + from.to(to).connect(this); + return from; + }, + + /** + Returns a string representation which attempts to provide more information + than Javascript's `toString` typically does, in a generic way for all Ember + objects. + ```javascript + const Person = Ember.Object.extend() + person = Person.create() + person.toString() //=> "<Person:ember1024>" + ``` + If the object's class is not defined on an Ember namespace, it will + indicate it is a subclass of the registered superclass: + ```javascript + const Student = Person.extend() + let student = Student.create() + student.toString() //=> "<(subclass of Person):ember1025>" + ``` + If the method `toStringExtension` is defined, its return value will be + included in the output. + ```javascript + const Teacher = Person.extend({ + toStringExtension() { + return this.get('fullName'); + } + }); + teacher = Teacher.create() + teacher.toString(); //=> "<Teacher:ember1026:Tom Dale>" + ``` + @method toString + @return {String} string representation + @public + */ + toString: function () { + var hasToStringExtension = typeof this.toStringExtension === 'function'; + var extension = hasToStringExtension ? ':' + this.toStringExtension() : ''; + var ret = '<' + this.constructor.toString() + ':' + _emberUtils.guidFor(this) + extension + '>'; + + return ret; + } + }); + CoreObject.PrototypeMixin.ownerConstructor = CoreObject; CoreObject.__super__ = null; var ClassMixinProps = { @@ -32908,204 +33105,10 @@ exports.default = CoreObject; }); /** - Defines the properties that will be concatenated from the superclass - (instead of overridden). - By default, when you extend an Ember class a property defined in - the subclass overrides a property with the same name that is defined - in the superclass. However, there are some cases where it is preferable - to build up a property's value by combining the superclass' property - value with the subclass' value. An example of this in use within Ember - is the `classNames` property of `Ember.View`. - Here is some sample code showing the difference between a concatenated - property and a normal one: - ```javascript - const Bar = Ember.Object.extend({ - // Configure which properties to concatenate - concatenatedProperties: ['concatenatedProperty'], - someNonConcatenatedProperty: ['bar'], - concatenatedProperty: ['bar'] - }); - const FooBar = Bar.extend({ - someNonConcatenatedProperty: ['foo'], - concatenatedProperty: ['foo'] - }); - let fooBar = FooBar.create(); - fooBar.get('someNonConcatenatedProperty'); // ['foo'] - fooBar.get('concatenatedProperty'); // ['bar', 'foo'] - ``` - This behavior extends to object creation as well. Continuing the - above example: - ```javascript - let fooBar = FooBar.create({ - someNonConcatenatedProperty: ['baz'], - concatenatedProperty: ['baz'] - }) - fooBar.get('someNonConcatenatedProperty'); // ['baz'] - fooBar.get('concatenatedProperty'); // ['bar', 'foo', 'baz'] - ``` - Adding a single property that is not an array will just add it in the array: - ```javascript - let fooBar = FooBar.create({ - concatenatedProperty: 'baz' - }) - view.get('concatenatedProperty'); // ['bar', 'foo', 'baz'] - ``` - Using the `concatenatedProperties` property, we can tell Ember to mix the - content of the properties. - In `Ember.Component` the `classNames`, `classNameBindings` and - `attributeBindings` properties are concatenated. - This feature is available for you to use throughout the Ember object model, - although typical app developers are likely to use it infrequently. Since - it changes expectations about behavior of properties, you should properly - document its usage in each individual concatenated property (to not - mislead your users to think they can override the property in a subclass). - @property concatenatedProperties - @type Array - @default null - @public -*/ - -/** - Defines the properties that will be merged from the superclass - (instead of overridden). - By default, when you extend an Ember class a property defined in - the subclass overrides a property with the same name that is defined - in the superclass. However, there are some cases where it is preferable - to build up a property's value by merging the superclass property value - with the subclass property's value. An example of this in use within Ember - is the `queryParams` property of routes. - Here is some sample code showing the difference between a merged - property and a normal one: - ```javascript - const Bar = Ember.Object.extend({ - // Configure which properties are to be merged - mergedProperties: ['mergedProperty'], - someNonMergedProperty: { - nonMerged: 'superclass value of nonMerged' - }, - mergedProperty: { - page: {replace: false}, - limit: {replace: true} - } - }); - const FooBar = Bar.extend({ - someNonMergedProperty: { - completelyNonMerged: 'subclass value of nonMerged' - }, - mergedProperty: { - limit: {replace: false} - } - }); - let fooBar = FooBar.create(); - fooBar.get('someNonMergedProperty'); - // => { completelyNonMerged: 'subclass value of nonMerged' } - // - // Note the entire object, including the nonMerged property of - // the superclass object, has been replaced - fooBar.get('mergedProperty'); - // => { - // page: {replace: false}, - // limit: {replace: false} - // } - // - // Note the page remains from the superclass, and the - // `limit` property's value of `false` has been merged from - // the subclass. - ``` - This behavior is not available during object `create` calls. It is only - available at `extend` time. - In `Ember.Route` the `queryParams` property is merged. - This feature is available for you to use throughout the Ember object model, - although typical app developers are likely to use it infrequently. Since - it changes expectations about behavior of properties, you should properly - document its usage in each individual merged property (to not - mislead your users to think they can override the property in a subclass). - @property mergedProperties - @type Array - @default null - @public -*/ - -/** - Destroyed object property flag. - if this property is `true` the observers and bindings were already - removed by the effect of calling the `destroy()` method. - @property isDestroyed - @default false - @public -*/ - -/** - Destruction scheduled flag. The `destroy()` method has been called. - The object stays intact until the end of the run loop at which point - the `isDestroyed` flag is set. - @property isDestroying - @default false - @public -*/ - -/** - Destroys an object by setting the `isDestroyed` flag and removing its - metadata, which effectively destroys observers and bindings. - If you try to set a property on a destroyed object, an exception will be - raised. - Note that destruction is scheduled for the end of the run loop and does not - happen immediately. It will set an isDestroying flag immediately. - @method destroy - @return {Ember.Object} receiver - @public -*/ - -/** - Override to implement teardown. - @method willDestroy - @public -*/ - -/** - Invoked by the run loop to actually destroy the object. This is - scheduled for execution by the `destroy` method. - @private - @method _scheduledDestroy -*/ - -/** - Returns a string representation which attempts to provide more information - than Javascript's `toString` typically does, in a generic way for all Ember - objects. - ```javascript - const Person = Ember.Object.extend() - person = Person.create() - person.toString() //=> "<Person:ember1024>" - ``` - If the object's class is not defined on an Ember namespace, it will - indicate it is a subclass of the registered superclass: - ```javascript - const Student = Person.extend() - let student = Student.create() - student.toString() //=> "<(subclass of Person):ember1025>" - ``` - If the method `toStringExtension` is defined, its return value will be - included in the output. - ```javascript - const Teacher = Person.extend({ - toStringExtension() { - return this.get('fullName'); - } - }); - teacher = Teacher.create() - teacher.toString(); //=> "<Teacher:ember1026:Tom Dale>" - ``` - @method toString - @return {String} string representation - @public -*/ - -/** Provides lookup-time type validation for injected properties. @private @method _onLookup */ enifed('ember-runtime/system/each_proxy', ['exports', 'ember-utils', 'ember-metal', 'ember-runtime/mixins/array'], function (exports, _emberUtils, _emberMetal, _emberRuntimeMixinsArray) { @@ -33688,11 +33691,11 @@ exports.A = A; exports.NativeArray = NativeArray; exports.default = NativeArray; }); // Ember.A circular -enifed('ember-runtime/system/object', ['exports', 'ember-runtime/system/core_object', 'ember-runtime/mixins/observable'], function (exports, _emberRuntimeSystemCore_object, _emberRuntimeMixinsObservable) { +enifed('ember-runtime/system/object', ['exports', 'ember-utils', 'ember-metal', 'ember-runtime/system/core_object', 'ember-runtime/mixins/observable'], function (exports, _emberUtils, _emberMetal, _emberRuntimeSystemCore_object, _emberRuntimeMixinsObservable) { /** @module ember @submodule ember-runtime */ @@ -33712,10 +33715,13 @@ var EmberObject = _emberRuntimeSystemCore_object.default.extend(_emberRuntimeMixinsObservable.default); EmberObject.toString = function () { return 'Ember.Object'; }; + var FrameworkObject = EmberObject; + + exports.FrameworkObject = FrameworkObject; exports.default = EmberObject; }); enifed('ember-runtime/system/object_proxy', ['exports', 'ember-runtime/system/object', 'ember-runtime/mixins/-proxy'], function (exports, _emberRuntimeSystemObject, _emberRuntimeMixinsProxy) { 'use strict'; @@ -35726,27 +35732,23 @@ currentState.enter(this); } } }); }); -enifed('ember-views/mixins/view_support', ['exports', 'ember-utils', 'ember-metal', 'ember-runtime', 'ember-environment', 'ember-views/system/utils', 'ember-views/system/jquery'], function (exports, _emberUtils, _emberMetal, _emberRuntime, _emberEnvironment, _emberViewsSystemUtils, _emberViewsSystemJquery) { +enifed('ember-views/mixins/view_support', ['exports', 'ember-utils', 'ember-metal', 'ember-environment', 'ember-views/system/utils', 'ember-views/system/jquery'], function (exports, _emberUtils, _emberMetal, _emberEnvironment, _emberViewsSystemUtils, _emberViewsSystemJquery) { 'use strict'; - var _Mixin$create; - - var INIT_WAS_CALLED = _emberUtils.symbol('INIT_WAS_CALLED'); - function K() { return this; } /** @class ViewMixin @namespace Ember @private */ - exports.default = _emberMetal.Mixin.create((_Mixin$create = { + exports.default = _emberMetal.Mixin.create({ concatenatedProperties: ['attributeBindings'], // .......................................................... // TEMPLATE SUPPORT // @@ -36092,46 +36094,32 @@ this._super.apply(this, arguments); if (!this.elementId && this.tagName !== '') { this.elementId = _emberUtils.guidFor(this); } + }, - this[INIT_WAS_CALLED] = true; + __defineNonEnumerable: function (property) { + this[property.name] = property.descriptor.value; + }, - if (typeof this.didInitAttrs === 'function') {} - } + // ....................................................... + // EVENT HANDLING + // - }, _Mixin$create[_emberRuntime.POST_INIT] = function () { - this._super(); - - this.renderer.componentInitAttrs(this, this.attrs || {}); - }, _Mixin$create.__defineNonEnumerable = function (property) { - this[property.name] = property.descriptor.value; - }, _Mixin$create.handleEvent = function (eventName, evt) { - return this._currentState.handleEvent(this, eventName, evt); - }, _Mixin$create)); + /** + Handle events from `Ember.EventDispatcher` + @method handleEvent + @param eventName {String} + @param evt {Event} + @private + */ + handleEvent: function (eventName, evt) { + return this._currentState.handleEvent(this, eventName, evt); + } + }); }); -/* - This is a special hook implemented in CoreObject, that allows Views/Components - to have a way to ensure that `init` fires before `didInitAttrs` / `didReceiveAttrs` - (so that `this._super` in init does not trigger `didReceiveAttrs` before the classes - own `init` is finished). - @method __postInitInitialization - @private - */ - -// ....................................................... -// EVENT HANDLING -// - -/** - Handle events from `Ember.EventDispatcher` - @method handleEvent - @param eventName {String} - @param evt {Event} - @private -*/ enifed("ember-views/system/action_manager", ["exports"], function (exports) { /** @module ember @submodule ember-views */ @@ -36773,11 +36761,11 @@ @deprecated Use `Ember.Component` instead. @uses Ember.Evented @uses Ember.ActionHandler @private */ - var CoreView = _emberRuntime.Object.extend(_emberRuntime.Evented, _emberRuntime.ActionHandler, { + var CoreView = _emberRuntime.FrameworkObject.extend(_emberRuntime.Evented, _emberRuntime.ActionHandler, { isView: true, _states: _emberViewsViewsStates.cloneStates(_emberViewsViewsStates.states), init: function () { @@ -36910,15 +36898,13 @@ // Handle events from `Ember.EventDispatcher` handleEvent: function () { return true; // continue event propagation }, - destroy: function () {}, + rerender: function () {}, - rerender: function (view) { - view.renderer.ensureViewNotRendering(view); - } + destroy: function () {} }; }); enifed('ember-views/views/states/destroying', ['exports', 'ember-utils', 'ember-metal', 'ember-views/views/states/default'], function (exports, _emberUtils, _emberMetal, _emberViewsViewsStatesDefault) { 'use strict'; @@ -36949,14 +36935,11 @@ $: function (view, sel) { var elem = view.element; return sel ? _emberViewsSystemJquery.default(sel, elem) : _emberViewsSystemJquery.default(elem); }, - // once the view has been inserted into the DOM, rerendering is - // deferred to allow bindings to synchronize. rerender: function (view) { - view.renderer.ensureViewNotRendering(view); view.renderer.rerender(view); }, destroy: function (view) { view.renderer.remove(view); @@ -38037,10 +38020,10 @@ // reduced computed macros enifed("ember/version", ["exports"], function (exports) { "use strict"; - exports.default = "2.9.0-beta.4"; + exports.default = "2.9.0-beta.5"; }); enifed('internal-test-helpers/factory', ['exports'], function (exports) { 'use strict'; exports.default = factory;