在这种简化的情况下,我有两个文件:index.htm,lazy.htm。
index.htm:
var myApp = angular.module('myApp', []); myApp.controller('embed',function($scope){ $scope.embed = 'Embedded Controller'; }); <div ng-controller="embed">{{embed}}</div> <div ng-include="'lazy.htm'"></div>
懒汉
myApp.controller('lazy',function($scope){ $scope.lazy = 'Lazy Controller'; }); <div ng-controller="lazy"> {{lazy}} </div>
结果是一个错误:“参数’lazy’不是一个函数,未定义”
改用函数
function lazy($scope) { $scope.lazy = 'Lazy Controller'; } <div ng-controller="lazy"> {{lazy}} </div>
直到1.3版本beta 14才可以使用。在beta 15中,删除了全局控制器功能:https : //github.com/angular/angular.js/issues/8296
因此,现在,有什么更好的方法来动态获取lazy.htm的有角度的内容?
更新:
在本文(http://ify.io/lazy-loading-in-angularjs)中,我找到了另一种可能的解决方案。$ controllerProvider允许我们在角度引导程序之后注册新的控制器。奇迹般有效。在 v1.3.0-beta.18中* 测试 *
var myApp = angular.module('myApp', []) .controller('embed',function($scope){ $scope.embed = 'Embedded Controller'; }) .config(function($controllerProvider) { myApp.cp = $controllerProvider; }); <div ng-controller="embed">{{embed}}</div> <div ng-include="'lazy.htm'"></div>
myApp.cp.register('lazy',function($scope){ $scope.lazy = 'Lazy Controller'; }); <div ng-controller="lazy"> {{lazy}} </div>
更新2:
其他两个可行的替代方法是:
_app = $('[ng-app]').scope(); _app.lazy = function($scope) { $scope.lazy = 'Lazy Controller'; };
要么
var $rootScope = $('[ng-app]').injector().get('$rootScope'); $rootScope.lazy = function($scope) { $scope.lazy = 'Lazy Controller'; };
但是我相信最后两个示例不应在生产中使用。
您也可以将jquery与$ routeProvider一起使用
app.js
/* Module Creation */ var app = angular.module ('app', ['ngRoute']); app.config(['$routeProvider', '$controllerProvider', function($routeProvider, $controllerProvider){ /*Creating a more synthesized form of service of $ controllerProvider.register*/ app.registerCtrl = $controllerProvider.register; function loadScript(path) { var result = $.Deferred(), script = document.createElement("script"); script.async = "async"; script.type = "text/javascript"; script.src = path; script.onload = script.onreadystatechange = function (_, isAbort) { if (!script.readyState || /loaded|complete/.test(script.readyState)) { if (isAbort) result.reject(); else result.resolve(); } }; script.onerror = function () { result.reject(); }; document.querySelector("head").appendChild(script); return result.promise(); } function loader(arrayName){ return { load: function($q){ var deferred = $q.defer(), map = arrayName.map(function(name) { return loadScript('js/controllers/'+name+".js"); }); $q.all(map).then(function(r){ deferred.resolve(); }); return deferred.promise; } }; } $routeProvider .when('/', { templateUrl: 'views/foo.html', resolve: loader(['foo']) }) .when('/bar',{ templateUrl: 'views/bar.html', controller: 'BarCtrl', resolve: loader(['bar']) }) .otherwise({ redirectTo: document.location.pathname }); }]);
/views/foo.html
<section ng-controller='FooCtrl'> {{text}} </section>
js / controllers / foo.js
/*Here we use the synthesized version of $controllerProvider.register to register the controller in view*/ app.registerCtrl('FooCtrl',function($scope){ $scope.text = 'Test'; });
/views/bar.html
<section> {{text2}} </section>
js / controllers / bar.js
app.registerCtrl('BarCtrl',function($scope){ $scope.text2 = 'Test'; });