Skip to content

Commit 50e6370

Browse files
committed
add dependencies attr in routeProvider.when and stateProvider.state
1 parent 7a880a6 commit 50e6370

File tree

3 files changed

+110
-109
lines changed

3 files changed

+110
-109
lines changed

angular-async-loader.js

Lines changed: 106 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -5,175 +5,186 @@
55
*
66
* subchen@gmail.com
77
*/
8-
(function () {
8+
(function() {
99

1010
function factory(angular, undefined) {
1111

12+
// Support require.js, sea.js, system.js
13+
var amdRequire = (function() {
14+
if (typeof(require) === 'function') {
15+
if (typeof(require.async) === 'function') {
16+
return require.async;
17+
}
18+
else {
19+
return require;
20+
}
21+
} else if (typeof(seajs) === 'object' && typeof(seajs.use) === 'function') {
22+
return seajs.use;
23+
} else if (typeof(System) === 'object' && typeof(System.import) === 'function') {
24+
return System.import;
25+
}
26+
throw new Error('No amd/cmd module loader found.');
27+
}());
28+
29+
/**
30+
* Load external dependencies, such as Controller, Service, etc.
31+
*
32+
* @param {String|Array} dependencies
33+
* @returns {*} a promised function to ajax load dependencies
34+
*/
35+
function requireLoadFn(dependencies) {
36+
if (typeof dependencies === 'string') {
37+
dependencies = [dependencies];
38+
}
39+
return ['$q', '$rootScope', function($q, $rootScope) {
40+
var defer = $q.defer();
41+
amdRequire(dependencies, function() {
42+
defer.resolve(Array.prototype.slice.call(arguments));
43+
$rootScope.$apply();
44+
});
45+
return defer.promise;
46+
}];
47+
}
48+
49+
/**
50+
* Rewrite route config for $routeProvider.when or $stateProvider.state.
51+
*
52+
* Transform 'controllerUrl' and 'dependencies' attrs into resolve object.
53+
*
54+
* @param {Object} config
55+
* @returns {Object} the modified config
56+
*/
57+
function route(config) {
58+
59+
function rewriteConfig(config) {
60+
if (config.hasOwnProperty('controllerUrl') || config.hasOwnProperty('dependencies')) {
61+
var dependencies = config.dependencies;
62+
if (dependencies === undefined) {
63+
dependencies = [];
64+
} else if (typeof dependencies === 'string') {
65+
dependencies = [dependencies];
66+
}
67+
if (config.controllerUrl) {
68+
dependencies.push(config.controllerUrl);
69+
}
70+
delete config.dependencies;
71+
delete config.controllerUrl;
72+
73+
var resolve = config.resolve || {};
74+
resolve['$dummy'] = requireLoadFn(dependencies);
75+
config.resolve = resolve;
76+
}
77+
}
78+
79+
// multiple views support
80+
if (config.hasOwnProperty('views')) {
81+
Object.keys(config.views).forEach(function(view) {
82+
rewriteConfig(config.views[view]);
83+
});
84+
} else {
85+
rewriteConfig(config);
86+
}
87+
88+
return config;
89+
}
90+
91+
1292
return {
1393
VERSION: '1.1.0',
1494

15-
configure: function (app) {
16-
17-
// Support require.js, sea.js, system.js
18-
if (app.require === undefined) {
19-
if (typeof(require) === 'function') {
20-
if (typeof(require.async) === 'function') {
21-
app.require = require.async;
22-
} else {
23-
app.require = require;
24-
}
25-
} else if (typeof(seajs) === 'object' && typeof (seajs.use) === 'function') {
26-
app.require = seajs.use;
27-
} else if (typeof(System) === 'object' && typeof (System.import) === 'function') {
28-
app.require = System.import;
29-
}
30-
}
95+
configure: function(app) {
3196

3297
app.provider('$asyncLoader', [
33-
'$controllerProvider',
34-
'$compileProvider',
35-
'$provide',
36-
'$filterProvider',
37-
function ($controllerProvider,
98+
'$controllerProvider',
99+
'$compileProvider',
100+
'$provide',
101+
'$filterProvider',
102+
function($controllerProvider,
38103
$compileProvider,
39104
$provide,
40105
$filterProvider) {
41-
this.$get = function () {
106+
this.$get = function() {
42107
return {
43108
$controllerProvider: $controllerProvider,
44109
$compileProvider: $compileProvider,
45110
$provide: $provide,
46111
$filterProvider: $filterProvider
47112
};
48113
};
49-
}]);
114+
}
115+
]);
50116

51-
app.run(['$asyncLoader', function ($asyncLoader) {
117+
app.run(['$asyncLoader', function($asyncLoader) {
52118
var $controllerProvider = $asyncLoader.$controllerProvider;
53119
var $compileProvider = $asyncLoader.$compileProvider;
54120
var $provide = $asyncLoader.$provide;
55121
var $filterProvider = $asyncLoader.$filterProvider;
56122

57-
app.value = function (name, value) {
123+
app.value = function(name, value) {
58124
$provide.value(name, value);
59125
return app;
60126
};
61127

62-
app.constant = function (name, value) {
128+
app.constant = function(name, value) {
63129
$provide.constant(name, value);
64130
return app;
65131
};
66132

67-
app.factory = function (name, factory) {
133+
app.factory = function(name, factory) {
68134
$provide.factory(name, factory);
69135
return app;
70136
};
71137

72-
app.service = function (name, service) {
138+
app.service = function(name, service) {
73139
$provide.service(name, service);
74140
return app;
75141
};
76142

77-
app.filter = function (name, filter) {
143+
app.filter = function(name, filter) {
78144
$filterProvider.register(name, filter);
79145
return app;
80146
};
81147

82-
app.directive = function (name, directive) {
148+
app.directive = function(name, directive) {
83149
$compileProvider.directive(name, directive);
84150
return app;
85151
};
86152

87-
app.controller = function (name, controller) {
153+
app.controller = function(name, controller) {
88154
$controllerProvider.register(name, controller);
89155
return app;
90156
};
91157

92-
app.decorator = function (name, decorator) {
158+
app.decorator = function(name, decorator) {
93159
$provide.decorator(name, decorator);
94160
return app;
95161
};
96162

97-
app.provider = function (name, service) {
163+
app.provider = function(name, service) {
98164
$provide.provider(name, service);
99165
return app;
100166
};
101167
}]);
102168

103169
// rewrite $routeProvider.when
104170
if (app.requires && app.requires.indexOf('ngRoute') !== -1) {
105-
app.config(['$routeProvider', function ($routeProvider) {
171+
app.config(['$routeProvider', function($routeProvider) {
106172
var whenFn = $routeProvider.when;
107173
$routeProvider.when = function(path, config) {
108-
return whenFn.call($routeProvider, path, app.route(config));
174+
return whenFn.call($routeProvider, path, route(config));
109175
};
110176
}]);
111177
}
112178
// rewrite $stateProvider.state
113179
if (app.requires && app.requires.indexOf('ui.router') !== -1) {
114-
app.config(['$stateProvider', function ($stateProvider) {
180+
app.config(['$stateProvider', function($stateProvider) {
115181
var stateFn = $stateProvider.state;
116182
$stateProvider.state = function(state, config) {
117-
return stateFn.call($stateProvider, state, app.route(config));
183+
return stateFn.call($stateProvider, state, route(config));
118184
};
119185
}]);
120186
}
121187

122-
/**
123-
* Rewrite config for $routeProvider.when or $stateProvider.state.
124-
*
125-
* Populate the resolve attribute using either 'controllerUrl'.
126-
*
127-
* @param {Object} config
128-
* @returns the modified config
129-
*/
130-
app.route = function (config) {
131-
function rewriteViewConfig(config) {
132-
if (config.hasOwnProperty('controllerUrl')) {
133-
var controllerUrl = config.controllerUrl;
134-
delete config.controllerUrl;
135-
136-
var resolve = config.resolve || {};
137-
resolve.dummyController = app.load([controllerUrl]);
138-
config.resolve = resolve;
139-
}
140-
}
141-
142-
// multiple views support
143-
if (config.hasOwnProperty('views')) {
144-
Object.keys(config.views).forEach(function(view) {
145-
rewriteViewConfig(config.views[view]);
146-
});
147-
} else {
148-
rewriteViewConfig(config);
149-
}
150-
151-
return config;
152-
};
153-
154-
155-
/**
156-
* Load external resources, such as Controller, Service, etc.
157-
*
158-
* @param {String|Array} dependencies
159-
* @returns {*} a promised function to ajax load resource
160-
*/
161-
app.load = function (dependencies) {
162-
if (!angular.isArray(dependencies)) {
163-
dependencies = [dependencies];
164-
}
165-
166-
return ['$q', '$rootScope', function ($q, $rootScope) {
167-
var defer = $q.defer();
168-
app.require(dependencies, function () {
169-
var out = arguments[arguments.length - 1];
170-
defer.resolve(out);
171-
$rootScope.$apply();
172-
});
173-
return defer.promise;
174-
}];
175-
};
176-
177188

178189
var injector;
179190

@@ -183,7 +194,7 @@
183194
* @param {String} name
184195
* @returns {*} the injected object
185196
*/
186-
app.get = function (name) {
197+
app.get = function(name) {
187198
if (injector === undefined) {
188199
var elements = [app.element, document, 'html', 'body'];
189200
for (var i = 0; i < elements.length; i++) {
@@ -204,7 +215,7 @@
204215
* @exports
205216
*/
206217
if (typeof(define) === 'function' && define.amd) {
207-
define(['angular'], function (angular) {
218+
define(['angular'], function(angular) {
208219
return factory(angular);
209220
});
210221
} else {

sample/webapp/app-routes.js

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,12 @@ define(function (require) {
1616
controllerUrl: 'home/homeCtrl', // new attribute for ajax load controller js
1717
controller: 'homeCtrl'
1818
})
19-
.state('users', app.route({
19+
.state('users', {
2020
url: '/users',
2121
templateUrl: 'users/users.html',
2222
controllerUrl: 'users/usersCtrl', // new attribute for ajax load controller js
2323
controller: 'usersCtrl',
24-
25-
/*
26-
// customize to load more dependencies
27-
resolve: {
28-
dummy: app.load([
29-
'users/usersCtrl', // controller
30-
'services/usersService' // service
31-
// filters, directives, ...
32-
])
33-
}
34-
*/
35-
}));
24+
dependencies: ['services/usersService']
25+
});
3626
}]);
3727
});

sample/webapp/users/usersCtrl.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
define(function (require) {
22
var app = require('../app');
33

4-
require('../services/usersService');
4+
//require('../services/usersService');
55

66
app.controller('usersCtrl', ['$scope', function ($scope) {
77
$scope.userList = app.get('usersService').list();

0 commit comments

Comments
 (0)