Mercurial > pub > ImplabJs
comparison src/implab/components/_ActivatableMixin.js @ 34:27e8e9e38e07 default tip
Слияние
| author | nickolay | 
|---|---|
| date | Wed, 05 Jun 2019 20:44:15 +0300 | 
| parents | 8af8e840dd49 1dc2fd263b90 | 
| children | 
   comparison
  equal
  deleted
  inserted
  replaced
| 33:8af8e840dd49 | 34:27e8e9e38e07 | 
|---|---|
| 1 define(["dojo/_base/declare", "../guard", "./StateMachine", "../log/_LogMixin", ], function (declare, guard, StateMachine, _LogMixin) { | |
| 2 | |
| 3 var states = { | |
| 4 inactive: { | |
| 5 activate: "activating" | |
| 6 }, | |
| 7 activating: { | |
| 8 success: "active", | |
| 9 failed: "inactive" | |
| 10 }, | |
| 11 active: { | |
| 12 deactivate: "deactivating" | |
| 13 }, | |
| 14 deactivating: { | |
| 15 success: "inactive", | |
| 16 failed: "active" | |
| 17 } | |
| 18 }; | |
| 19 | |
| 20 return declare([_LogMixin], { | |
| 21 _controller: null, | |
| 22 | |
| 23 _active: null, | |
| 24 | |
| 25 constructor: function () { | |
| 26 this._active = new StateMachine({ | |
| 27 states: states, | |
| 28 initial: "inactive" | |
| 29 }); | |
| 30 }, | |
| 31 | |
| 32 /** | |
| 33 * @returns {Object} контроллер для активации текущей компоненты | |
| 34 */ | |
| 35 getController: function () { | |
| 36 return this._controller; | |
| 37 }, | |
| 38 | |
| 39 /** | |
| 40 * @param {Object} | |
| 41 * v Контроллер для активации текущей компоненты | |
| 42 */ | |
| 43 setController: function (v) { | |
| 44 this._controller = v; | |
| 45 }, | |
| 46 | |
| 47 /** | |
| 48 * @returns {Boolean} текущая компонента активна | |
| 49 */ | |
| 50 isActive: function () { | |
| 51 return this._active.current == "active"; | |
| 52 }, | |
| 53 | |
| 54 assertActive: function () { | |
| 55 if (!this.isActive()) | |
| 56 throw new Error("The object must be active to perform the operation"); | |
| 57 }, | |
| 58 | |
| 59 /** | |
| 60 * Активирует текущую компоненту, если у текущей компоненты задан | |
| 61 * контроллер, то активация будет осуществляться через него | |
| 62 * | |
| 63 * @async | |
| 64 * @param{Boolean} | |
| 65 * direct вызов должен осуществится напрямую, без участия | |
| 66 * контроллера. | |
| 67 * @return{Boolean} успешно/неуспешно | |
| 68 */ | |
| 69 activate: function (direct) { | |
| 70 var me = this; | |
| 71 if (!direct && this._controller) | |
| 72 return me._controller.activate(me).then(function () { | |
| 73 me.onActivated(); | |
| 74 }); | |
| 75 | |
| 76 me._active.move("activate"); | |
| 77 return guard(me, "onActivating").then(function () { | |
| 78 me.log("Activated"); | |
| 79 me._active.move("success"); | |
| 80 if (!me._controller) | |
| 81 me.onActivated(); | |
| 82 }, function (err) { | |
| 83 console.error(err); | |
| 84 me.error("Activation failed: {0}", err); | |
| 85 me._active.move("failed"); | |
| 86 throw err; | |
| 87 }); | |
| 88 }, | |
| 89 | |
| 90 /** | |
| 91 * Деактивирует текущую компоненту, если у компоненты задан контроллер, | |
| 92 * то деактивация будет осуществляться через него. | |
| 93 * | |
| 94 * @async | |
| 95 * @param{Boolean} direct вызов должен осуществится напрямую, без | |
| 96 * участия контроллера. | |
| 97 * | |
| 98 */ | |
| 99 deactivate: function (direct) { | |
| 100 var me = this; | |
| 101 if (!direct && me._controller) | |
| 102 return me._controller.deactivate(me).then(function () { | |
| 103 me.onDeactivated(); | |
| 104 }); | |
| 105 | |
| 106 me._active.move("deactivate"); | |
| 107 return guard(me, "onDeactivating").then(function () { | |
| 108 me.log("Deactivated"); | |
| 109 me._active.move("success"); | |
| 110 if (!me._controller) | |
| 111 me.onDeactivated(); | |
| 112 }, function (err) { | |
| 113 console.error(err); | |
| 114 me.error("Deactivation failed: {0}", err); | |
| 115 me.move("failed"); | |
| 116 throw err; | |
| 117 }); | |
| 118 | |
| 119 }, | |
| 120 | |
| 121 toogleActive: function () { | |
| 122 var me = this; | |
| 123 return (me.isActive() ? me.deactivate() : me.activate()).then(function () { | |
| 124 return me.isActive(); | |
| 125 }); | |
| 126 }, | |
| 127 | |
| 128 /** | |
| 129 * Событие вызывается перед активацией текущей компоненты | |
| 130 * | |
| 131 * @returns{Boolean|undefined} если false - активация будет отменена | |
| 132 */ | |
| 133 onActivating: function () {}, | |
| 134 | |
| 135 /** | |
| 136 * Событие вызывается перед деактивацией текущей компоненты | |
| 137 * | |
| 138 * @returns {Boolean|undefined} если false - деактивация будет отменена | |
| 139 */ | |
| 140 onDeactivating: function () {}, | |
| 141 | |
| 142 /** | |
| 143 * Событие вызывается после активации текущей компоненты | |
| 144 */ | |
| 145 onActivated: function () {}, | |
| 146 | |
| 147 /** | |
| 148 * Событие вызывается после деактивации текущей компоненты | |
| 149 */ | |
| 150 onDeactivated: function () {} | |
| 151 | |
| 152 }); | |
| 153 }); | 
