0
|
1 define([ "dojo/_base/declare", "./guard", "./safe", "./_LogMixin" ],
|
|
2
|
|
3 function(declare, guard, safe, _LogMixin) {
|
|
4 "use strict";
|
|
5 return declare([ _LogMixin ], {
|
|
6
|
|
7 _current : null,
|
|
8
|
|
9 _pending : false,
|
|
10
|
|
11 getCurrent : function() {
|
|
12 return this._current;
|
|
13 },
|
|
14
|
|
15 _start : function() {
|
|
16 if (this._pending)
|
|
17 throw new Error("The activation/decativation is already pending");
|
|
18 this._pending = true;
|
|
19 },
|
|
20
|
|
21 _await : function(d) {
|
|
22 var me = this;
|
|
23 return d.then(function(x) {
|
|
24 me._pending = false;
|
|
25 return x;
|
|
26 }, function(e) {
|
|
27 me._pending = false;
|
|
28 throw e;
|
|
29 });
|
|
30 },
|
|
31
|
|
32 activate : function(component) {
|
|
33 safe.argumentNotNull(component, "component");
|
|
34 var me = this;
|
|
35 if (component.getController() !== this)
|
|
36 throw new Error("The specified component doesn't belong to this controller");
|
|
37
|
|
38 return me._await(guard(me, "_start").then(function() {
|
|
39 me._activate(component);
|
|
40 }));
|
|
41 },
|
|
42
|
|
43 _activate : function(component) {
|
|
44 var me = this;
|
|
45 if (me._current === component)
|
|
46 return guard(false);
|
|
47
|
|
48 // before activation hook
|
|
49 return guard(me, "onActivating", [ component ]).then(function() {
|
|
50 // deactivate curent
|
|
51 if (me._current)
|
|
52 return me._current.deactivate(true).then(function() {
|
|
53 try {
|
|
54 me._current.onDeactivated();
|
|
55 } catch (err) {
|
|
56 me.error(err);
|
|
57 }
|
|
58 // HACK raise deactivated event
|
|
59 try {
|
|
60 me.onDeactivated(me._current, component);
|
|
61 } catch (err) {
|
|
62 // deactivated shouldn't affect the process
|
|
63 me.error(err);
|
|
64 }
|
|
65 me._current = null;
|
|
66
|
|
67 });
|
|
68 }).then(function() {
|
|
69 return component.activate(true);
|
|
70 }).then(function() {
|
|
71 me._current = component;
|
|
72 try {
|
|
73 me.onActivated(component);
|
|
74 } catch (err) {
|
|
75 me.error(err);
|
|
76 }
|
|
77
|
|
78 });
|
|
79
|
|
80 },
|
|
81
|
|
82 /**
|
|
83 * Деактивирует текущую компоненту.
|
|
84 *
|
|
85 * @async
|
|
86 * @returns true - компонента была деактивирована, либо нет активной
|
|
87 * компоненты. false - запрос на деактивацию - отклонен.
|
|
88 */
|
|
89 deactivate : function() {
|
|
90 var me = this;
|
|
91 return me._await(guard(me,"_start").then(function() {
|
|
92 return me._deactivate();
|
|
93 }));
|
|
94 },
|
|
95
|
|
96 _deactivate : function() {
|
|
97 var me = this;
|
|
98 if (!me._current)
|
|
99 return guard(false);
|
|
100
|
|
101 return guard(me, "onDeactivating").then(function() {
|
|
102 return me._current.deactivate(true);
|
|
103 }).then(function() {
|
|
104 // HACK raise deactivated event
|
|
105 try {
|
|
106 me.onDeactivated(me._current);
|
|
107 } catch (err) {
|
|
108 me.error(err);
|
|
109 }
|
|
110 me._current = null;
|
|
111 });
|
|
112 },
|
|
113
|
|
114 onActivating : function(component) {
|
|
115 },
|
|
116
|
|
117 onDeactivating : function(component) {
|
|
118 },
|
|
119
|
|
120 onDeactivated : function(component, next) {
|
|
121 },
|
|
122
|
|
123 onActivated : function(component) {
|
|
124 }
|
|
125 });
|
|
126 }); |