Mercurial > pub > ImplabJs
view core/src/js/components/_ActivatableMixin.js @ 30:2dfba21cd879
sync
author | cin |
---|---|
date | Wed, 27 Jun 2018 02:46:14 +0300 |
parents | acdcdf1a8d21 |
children |
line wrap: on
line source
define(["dojo/_base/declare", "../guard", "./StateMachine", "../log/_LogMixin", ], function (declare, guard, StateMachine, _LogMixin) { var states = { inactive: { activate: "activating" }, activating: { success: "active", failed: "inactive" }, active: { deactivate: "deactivating" }, deactivating: { success: "inactive", failed: "active" } }; return declare([_LogMixin], { _controller: null, _active: null, constructor: function () { this._active = new StateMachine({ states: states, initial: "inactive" }); }, /** * @returns {Object} контроллер для активации текущей компоненты */ getController: function () { return this._controller; }, /** * @param {Object} * v Контроллер для активации текущей компоненты */ setController: function (v) { this._controller = v; }, /** * @returns {Boolean} текущая компонента активна */ isActive: function () { return this._active.current == "active"; }, assertActive: function () { if (!this.isActive()) throw new Error("The object must be active to perform the operation"); }, /** * Активирует текущую компоненту, если у текущей компоненты задан * контроллер, то активация будет осуществляться через него * * @async * @param{Boolean} * direct вызов должен осуществится напрямую, без участия * контроллера. * @return{Boolean} успешно/неуспешно */ activate: function (direct) { var me = this; if (!direct && this._controller) return me._controller.activate(me).then(function () { me.onActivated(); }); me._active.move("activate"); return guard(me, "onActivating").then(function () { me.log("Activated"); me._active.move("success"); if (!me._controller) me.onActivated(); }, function (err) { console.error(err); me.error("Activation failed: {0}", err); me._active.move("failed"); throw err; }); }, /** * Деактивирует текущую компоненту, если у компоненты задан контроллер, * то деактивация будет осуществляться через него. * * @async * @param{Boolean} direct вызов должен осуществится напрямую, без * участия контроллера. * */ deactivate: function (direct) { var me = this; if (!direct && me._controller) return me._controller.deactivate(me).then(function () { me.onDeactivated(); }); me._active.move("deactivate"); return guard(me, "onDeactivating").then(function () { me.log("Deactivated"); me._active.move("success"); if (!me._controller) me.onDeactivated(); }, function (err) { console.error(err); me.error("Deactivation failed: {0}", err); me.move("failed"); throw err; }); }, toogleActive: function () { var me = this; return (me.isActive() ? me.deactivate() : me.activate()).then(function () { return me.isActive(); }); }, /** * Событие вызывается перед активацией текущей компоненты * * @returns{Boolean|undefined} если false - активация будет отменена */ onActivating: function () {}, /** * Событие вызывается перед деактивацией текущей компоненты * * @returns {Boolean|undefined} если false - деактивация будет отменена */ onDeactivating: function () {}, /** * Событие вызывается после активации текущей компоненты */ onActivated: function () {}, /** * Событие вызывается после деактивации текущей компоненты */ onDeactivated: function () {} }); });