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