3
|
1 define(["dojo/_base/declare", "../guard", "./StateMachine", "../log/_LogMixin", ], function (declare, guard, StateMachine, _LogMixin) {
|
0
|
2
|
|
3 var states = {
|
3
|
4 inactive: {
|
|
5 activate: "activating"
|
0
|
6 },
|
3
|
7 activating: {
|
|
8 success: "active",
|
|
9 failed: "inactive"
|
0
|
10 },
|
3
|
11 active: {
|
|
12 deactivate: "deactivating"
|
0
|
13 },
|
3
|
14 deactivating: {
|
|
15 success: "inactive",
|
|
16 failed: "active"
|
0
|
17 }
|
|
18 };
|
|
19
|
3
|
20 return declare([_LogMixin], {
|
|
21 _controller: null,
|
0
|
22
|
3
|
23 _active: null,
|
0
|
24
|
3
|
25 constructor: function () {
|
0
|
26 this._active = new StateMachine({
|
3
|
27 states: states,
|
|
28 initial: "inactive"
|
0
|
29 });
|
|
30 },
|
|
31
|
|
32 /**
|
|
33 * @returns {Object} контроллер для активации текущей компоненты
|
|
34 */
|
3
|
35 getController: function () {
|
0
|
36 return this._controller;
|
|
37 },
|
|
38
|
|
39 /**
|
|
40 * @param {Object}
|
|
41 * v Контроллер для активации текущей компоненты
|
|
42 */
|
3
|
43 setController: function (v) {
|
0
|
44 this._controller = v;
|
|
45 },
|
|
46
|
|
47 /**
|
|
48 * @returns {Boolean} текущая компонента активна
|
|
49 */
|
3
|
50 isActive: function () {
|
0
|
51 return this._active.current == "active";
|
|
52 },
|
|
53
|
3
|
54 assertActive: function () {
|
0
|
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 */
|
3
|
69 activate: function (direct) {
|
0
|
70 var me = this;
|
|
71 if (!direct && this._controller)
|
3
|
72 return me._controller.activate(me).then(function () {
|
0
|
73 me.onActivated();
|
|
74 });
|
|
75
|
|
76 me._active.move("activate");
|
3
|
77 return guard(me, "onActivating").then(function () {
|
0
|
78 me.log("Activated");
|
|
79 me._active.move("success");
|
|
80 if (!me._controller)
|
|
81 me.onActivated();
|
3
|
82 }, function (err) {
|
0
|
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 */
|
3
|
99 deactivate: function (direct) {
|
0
|
100 var me = this;
|
|
101 if (!direct && me._controller)
|
3
|
102 return me._controller.deactivate(me).then(function () {
|
0
|
103 me.onDeactivated();
|
|
104 });
|
|
105
|
|
106 me._active.move("deactivate");
|
3
|
107 return guard(me, "onDeactivating").then(function () {
|
0
|
108 me.log("Deactivated");
|
|
109 me._active.move("success");
|
|
110 if (!me._controller)
|
|
111 me.onDeactivated();
|
3
|
112 }, function (err) {
|
0
|
113 console.error(err);
|
|
114 me.error("Deactivation failed: {0}", err);
|
|
115 me.move("failed");
|
|
116 throw err;
|
|
117 });
|
|
118
|
|
119 },
|
|
120
|
3
|
121 toogleActive: function () {
|
0
|
122 var me = this;
|
3
|
123 return (me.isActive() ? me.deactivate() : me.activate()).then(function () {
|
0
|
124 return me.isActive();
|
|
125 });
|
|
126 },
|
|
127
|
|
128 /**
|
|
129 * Событие вызывается перед активацией текущей компоненты
|
|
130 *
|
|
131 * @returns{Boolean|undefined} если false - активация будет отменена
|
|
132 */
|
3
|
133 onActivating: function () {},
|
0
|
134
|
|
135 /**
|
|
136 * Событие вызывается перед деактивацией текущей компоненты
|
|
137 *
|
|
138 * @returns {Boolean|undefined} если false - деактивация будет отменена
|
|
139 */
|
3
|
140 onDeactivating: function () {},
|
0
|
141
|
|
142 /**
|
|
143 * Событие вызывается после активации текущей компоненты
|
|
144 */
|
3
|
145 onActivated: function () {},
|
0
|
146
|
|
147 /**
|
|
148 * Событие вызывается после деактивации текущей компоненты
|
|
149 */
|
3
|
150 onDeactivated: function () {}
|
0
|
151
|
|
152 });
|
|
153 }); |