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 }); |