-
Notifications
You must be signed in to change notification settings - Fork 863
/
controller.js
104 lines (89 loc) · 2.79 KB
/
controller.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/**
* sub controller for navigation-view
* @author yiminghe@gmail.com
*/
KISSY.add(function (S, require) {
var Base = require('base');
var router = require('router');
var Promise = require('promise');
function doRoute(request) {
var self = this;
var subView = self.getSubView();
var navigationView = self.get('navigationView');
var activeView = navigationView.get('activeView');
if (!subView) {
subView = new (self.get('SubView'))();
navigationView.addChild(subView);
subView.get('el').css('transform', 'translateX(-9999px) translateZ(0)');
}
subView.controller = self;
this.defer = new Promise.Defer();
this.promise = this.defer.promise;
if (!request.replace ||
// first screen replace
!activeView) {
if (activeView) {
activeView.controller.leave();
}
if (navigationView.waitingView) {
navigationView.waitingView.controller.leave();
}
}
self.enter();
var route = request.route;
var routes = self.get('routes');
if (routes[route.path]) {
self[routes[route.path]].apply(self, arguments);
}
if (!request.replace ||
// first screen replace
!activeView) {
var async = !self.promise.isResolved();
if (async) {
subView.reset('title');
}
navigationView[request.backward ? 'pop' : 'push'](subView, async);
}
}
return Base.extend({
router: router,
initializer: function () {
var self = this;
var path;
self.doRoute = S.bind(doRoute, self);
var routes = self.get('routes');
for (path in routes) {
router.get(path, self.doRoute);
}
},
leave: function () {
},
enter: function () {
},
getSubView: function () {
var self = this;
var navigationView = self.get('navigationView');
var SubView = self.get('SubView');
var children = navigationView.get('children');
for (var i = children.length - 1; i >= 0; i--) {
if (children[i].constructor === SubView) {
return children[i];
}
}
return undefined;
},
navigate: function (url, options) {
router.navigate(url, options);
},
'isSubViewActive': function () {
return this.get('navigationView').get('activeView') === this.getSubView();
}
}, {
ATTRS: {
routes: {
},
SubView: {
}
}
});
});