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