File: base/js/BaseObservable.js
- /**
- The `base-observable` submodule adds observability to Base's lifecycle and
- attributes, and also make it an `EventTarget`.
-
- @module base
- @submodule base-observable
- **/
- var L = Y.Lang,
-
- DESTROY = "destroy",
- INIT = "init",
-
- BUBBLETARGETS = "bubbleTargets",
- _BUBBLETARGETS = "_bubbleTargets",
-
- AttributeObservable = Y.AttributeObservable,
- BaseCore = Y.BaseCore;
-
- /**
- Provides an augmentable implementation of lifecycle and attribute events for
- `BaseCore`.
-
- @class BaseObservable
- @extensionfor BaseCore
- @uses AttributeObservable
- @uses EventTarget
- @since 3.8.0
- **/
- function BaseObservable() {}
-
- BaseObservable._ATTR_CFG = AttributeObservable._ATTR_CFG.concat();
- BaseObservable._NON_ATTRS_CFG = ["on", "after", "bubbleTargets"];
-
- BaseObservable.prototype = {
-
- /**
- * Initializes Attribute
- *
- * @method _initAttribute
- * @private
- */
- _initAttribute: function() {
- BaseCore.prototype._initAttribute.apply(this, arguments);
- AttributeObservable.call(this);
-
- this._eventPrefix = this.constructor.EVENT_PREFIX || this.constructor.NAME;
- this._yuievt.config.prefix = this._eventPrefix;
- },
-
- /**
- * Init lifecycle method, invoked during construction.
- * Fires the init event prior to setting up attributes and
- * invoking initializers for the class hierarchy.
- *
- * @method init
- * @chainable
- * @param {Object} config Object with configuration property name/value pairs
- * @return {Base} A reference to this object
- */
- init: function(config) {
-
- /**
- * <p>
- * Lifecycle event for the init phase, fired prior to initialization.
- * Invoking the preventDefault() method on the event object provided
- * to subscribers will prevent initialization from occuring.
- * </p>
- * <p>
- * Subscribers to the "after" momemt of this event, will be notified
- * after initialization of the object is complete (and therefore
- * cannot prevent initialization).
- * </p>
- *
- * @event init
- * @preventable _defInitFn
- * @param {EventFacade} e Event object, with a cfg property which
- * refers to the configuration object passed to the constructor.
- */
-
- // PERF: Using lower level _publish() for
- // critical path performance
-
- var type = this._getFullType(INIT),
- e = this._publish(type);
-
- e.emitFacade = true;
- e.fireOnce = true;
- e.defaultTargetOnly = true;
- e.defaultFn = this._defInitFn;
-
- this._preInitEventCfg(config);
-
- if (e._hasPotentialSubscribers()) {
- this.fire(type, {cfg: config});
- } else {
-
- this._baseInit(config);
-
- // HACK. Major hack actually. But really fast for no-listeners.
- // Since it's fireOnce, subscribers may come along later, so since we're
- // bypassing the event stack the first time, we need to tell the published
- // event that it's been "fired". Could extract it into a CE method?
- e.fired = true;
- e.firedWith = [{cfg:config}];
- }
-
- return this;
- },
-
- /**
- * Handles the special on, after and target properties which allow the user to
- * easily configure on and after listeners as well as bubble targets during
- * construction, prior to init.
- *
- * @private
- * @method _preInitEventCfg
- * @param {Object} config The user configuration object
- */
- _preInitEventCfg : function(config) {
- if (config) {
- if (config.on) {
- this.on(config.on);
- }
- if (config.after) {
- this.after(config.after);
- }
- }
-
- var i, l, target,
- userTargets = (config && BUBBLETARGETS in config);
-
- if (userTargets || _BUBBLETARGETS in this) {
- target = userTargets ? (config && config.bubbleTargets) : this._bubbleTargets;
-
- if (L.isArray(target)) {
- for (i = 0, l = target.length; i < l; i++) {
- this.addTarget(target[i]);
- }
- } else if (target) {
- this.addTarget(target);
- }
- }
- },
-
- /**
- * <p>
- * Destroy lifecycle method. Fires the destroy
- * event, prior to invoking destructors for the
- * class hierarchy.
- * </p>
- * <p>
- * Subscribers to the destroy
- * event can invoke preventDefault on the event object, to prevent destruction
- * from proceeding.
- * </p>
- * @method destroy
- * @return {Base} A reference to this object
- * @chainable
- */
- destroy: function() {
- Y.log('destroy called', 'life', 'base');
-
- /**
- * <p>
- * Lifecycle event for the destroy phase,
- * fired prior to destruction. Invoking the preventDefault
- * method on the event object provided to subscribers will
- * prevent destruction from proceeding.
- * </p>
- * <p>
- * Subscribers to the "after" moment of this event, will be notified
- * after destruction is complete (and as a result cannot prevent
- * destruction).
- * </p>
- * @event destroy
- * @preventable _defDestroyFn
- * @param {EventFacade} e Event object
- */
- this.publish(DESTROY, {
- fireOnce:true,
- defaultTargetOnly:true,
- defaultFn: this._defDestroyFn
- });
- this.fire(DESTROY);
-
- this.detachAll();
- return this;
- },
-
- /**
- * Default init event handler
- *
- * @method _defInitFn
- * @param {EventFacade} e Event object, with a cfg property which
- * refers to the configuration object passed to the constructor.
- * @protected
- */
- _defInitFn : function(e) {
- this._baseInit(e.cfg);
- },
-
- /**
- * Default destroy event handler
- *
- * @method _defDestroyFn
- * @param {EventFacade} e Event object
- * @protected
- */
- _defDestroyFn : function(e) {
- this._baseDestroy(e.cfg);
- }
- };
-
- Y.mix(BaseObservable, AttributeObservable, false, null, 1);
-
- Y.BaseObservable = BaseObservable;
-
-