问题
Angular 不是动态的,您不能动态添加控制器,也不能工厂等。您也不能推迟控制器引导,Angular 将所有内容加载在一起,这是相当不利的(将在 Angular 2 中修复)
治疗
但是 javascript 本身有一个非常重要的特性——closure,它可以随时随地工作。
并且 Angular 有一些内部服务可以注入到 Angular 生态系统之外,甚至可以注入到浏览器控制台中。这些服务注入如下所示。 从技术上讲,我们可以使用其他任何东西(jQuery.ajax、window.fetch,甚至是XMLHttpRequest),但让我们坚持使用全角度解决方案
var $http_injected = angular.injector(["ng"]).get("$http");
行为
首先,我们推迟整个 Angular 应用程序引导,注入 http 服务。然后你提出你需要的请求,接收数据,然后关闭开始工作,我们将接收到的数据传递给一些服务,或者我们也可以分配给一些 angular.constant 或 angular.value 但让我们用 angular.service 做演示,所以当您的服务有数据时,引导整个应用程序,以便使用您需要的数据初始化所有控制器
基本上这类任务就是这样解决的
<body>
<div ng-controller="Controller1">
<b>Controller1</b>
{{text}}
{{setting.data.name}}
</div>
<hr>
<div ng-controller="Controller2">
<b>Controller2</b>
{{text}}
{{setting.data.name}}
</div>
<script>
//define preloader
var $http_injected = angular.injector(["ng"]).get("$http");
$http_injected.get('http://jsonplaceholder.typicode.com/users/1').then(function(successResponse) {
//define app
angular.module('app', []);
//define test controllers
//note, usually we see 'controller1 loaded' text before 'settings applied', because controller initialized with this data, but in this demo, we will not see 'controller1 loaded' text, as we use closure to assign data, so it's instantly changed
angular.module('app').controller('Controller1', function($scope, AppSetting) {
$scope.text = 'controller1 loaded';
$scope.setting = AppSetting.setting;
$scope.$watch('setting', function(e1 ,e2){
$scope.text = 'settings applied'
});
});
angular.module('app').controller('Controller2', function($scope, AppSetting) {
$scope.text = 'controller2 loaded';
$scope.setting = AppSetting.setting;
$scope.$watch('setting', function(e1 ,e2){
$scope.text = 'settings applied'
});
});
//define test services, note we assign it here, it's possible
//because of javascript awesomeness (closure)
angular.module('app').service('AppSetting', function() {
this.setting = successResponse;
});
//bootstrap app, we cannot use ng-app, as it loads app instantly
//but we bootstrap it manually when you settings come
angular.bootstrap(document.body, ['app']);
});
</script>
</body>
Plunker demo