我使用meteor + angular。我的目的是在app bootstrap之后添加更多依赖项(这是因为程序包是一开始处理bootstrapping的程序包,我不太了解它)。在这样做的同时,我还想强制执行一个基本的代码结构,例如,我将在一个模块中编译所有控制器。
以下是基本想法:
'use strict';
angular.module('app.controllers', [])
.controller('MainCtrl', function() {
// ...
})
.controller('SubCtrl', function() {
// ...
})
.controller('AnotherCtrl', function() {
// ...
});
然后将其作为依赖项包含在主模块中:
angular.module('app', [
'app.filters',
'app.services',
'app.directives',
'app.controllers' // Here
]);
经过一番研究,我发现我尝试做的事情(在bootstrap之后添加依赖项)实际上是角度团队的功能请求的一部分。因此,我的选择是使用$controllerProvider
和register()
函数:
Meteor.config(function($controllerProvider) {
$controllerProvider.register('MainCtrl', function($scope) {
// ...
});
});
Meteor.config(function($controllerProvider) {
$controllerProvider.register('SubCtrl', function($scope) {
// ...
});
});
Meteor.config(function($controllerProvider) {
$controllerProvider.register('AnotherCtrl', function($scope) {
// ...
});
});
它的作品虽然不那么优雅。问题是:
config
和register
部分的更优雅方式是什么?答案 0 :(得分:12)
创建您的模块:
angular.module('app.controllers', []);
将其添加为依赖项:
angular.module('app').requires.push('app.controllers');
答案 1 :(得分:1)
根据this presentation(幻灯片12),您可以将controllerProvider
分配给应用。
替换模块controller
方法的示例:http://jsfiddle.net/arzo/HB7LU/6659/
var myApp = angular.module('myApp', []);
//note overriding controller method might be a little controversial :D
myApp.config(function allowRegisteringControllersInRuntime($controllerProvider) {
var backup = myApp.controller;
myApp.controller = $controllerProvider.register;
myApp.controller.legacy = backup;
})
myApp.run(function ($rootScope, $compile) {
myApp.controller('MyCtrl', function($scope) {
$scope.name = 'Superhero';
})
var elem;
var scope=$rootScope;
elem = $compile('<p ng-controller="MyCtrl">{{name}}</br><input ng-model="name" /></p>')($rootScope, function (clonedElement, scope) {
console.log('newly created element', clonedElement[0])
document.body.appendChild(clonedElement[0]);
});
console.log('You can access original register via', myApp.controller.legacy);
})
答案 2 :(得分:1)
我见过的唯一方法是使用您自己的函数替换angular.module
函数,返回用于引导应用程序的模块。
var myApp = angular.module('myApp', []);
angular.module = function() {
return myApp;
}
以便之后注册的所有模块实际上都在您的myApp
模块中注册。
此方法与您在问题中描述的方法(使用$controllerProvider
等提供程序)相结合,可以在angular.bootstrap
之后添加“模块”。
<强>演示强>
请参阅此jsfiddle了解演示:https://jsfiddle.net/josketres/aw3L38r4/
<强>缺点强>
config
之后添加的模块的angular.bootstrap
块。也许有办法解决这个问题,但我还没找到。angular.module
感觉就像是“肮脏的黑客”。