이 글의 내용은 AngularJS에서 Controller를 동적으로 로드하는 방법을 공유하는 것입니다. 여기에는 특정 참조 값이 있습니다. 필요한 친구가 참조할 수 있습니다.
Controller를 동적으로 로드하는 방법을 공통 모듈에 캡슐화합니다. 이 모듈의 이름을 ngCommon
. ngCommon
。
(function (angular) {'use strict'; var CommonApp = angular.module('ngCommon'); ... })(angular);
接下来我们实现一个动态加载js的方法$require
。
/* 记录已加载的js */ var loaded = {}; /* 检测是否加载 */ var checkLoaded = function (url) { return !url || !angular.isString(url) || loaded[url];}; CommonApp.factory('$require', ['$document', '$q', '$rootScope', function ($document, $q, $rootScope) { return function (url) { var script = null; var onload = null; var doc = $document[0]; var body = doc.body; var deferred = $q.defer(); if (checkLoaded(url)) { deferred.resolve(); } else { script = doc.createElement('script'); onload = function (info) { if (info === 1) { deferred.reject(); } else { loaded[url] = 1; /* AngularJS < 1.2.x 请使用$timeout */ $rootScope.$evalAsync(function () { deferred.resolve(); }); } script.onload = script.onerror = null; body.removeChild(script); script = null; }; script.onload = onload; script.onerror = function () { onload(1); }; script.async = true; script.src = url; body.appendChild(script); } return deferred.promise; };}]);
然后重点来了,通过$routeProvider route
的resolve
功能来实现动态加载Controller。
CommonApp.provider('$routeResolver', function () { this.$get = function () { return this; }; this.route = function (routeCnf) { var controller = routeCnf.controller; var controllerUrl = routeCnf.controllerUrl; if (controllerUrl) { routeCnf.reloadOnSearch = routeCnf.reloadOnSearch || false; routeCnf.resolve = { load: ['$route', '$require', 'ControllerChecker', function ($route, $require, ControllerChecker) { var controllerName = angular.isFunction(controller) ? controller($route.current.params) : controller; var url = angular.isFunction(controllerUrl) ? controllerUrl($route.current.params) : controllerUrl; if (checkLoaded(url) || (controllerName && ControllerChecker.exists(controllerName))) { loaded[url] = true; return; } return $require(url); }] }; } return routeCnf; };})
看上面的代码中还注入了一个叫ControllerChecker
CommonApp.service('ControllerChecker', ['$controller', function ($controller) { return { exists: function (controllerName) { if (angular.isFunction(window[controllerName])) { return true; } try { $controller(controllerName, {}, true); return true; } catch (e) { return false; } } };}]);
$require
. CommonApp.setupRegister = function (module) { module.config([ '$controllerProvider', '$compileProvider', '$filterProvider', '$provide', function ($controllerProvider, $compileProvider, $filterProvider, $provide) { module.register = { controller: $controllerProvider.register, directive: $compileProvider.directive, filter: $filterProvider.register, factory: $provide.factory, service: $provide.service, value: $provide.value, constant: $provide.constant }; } ]);};
$routeProvider 경로
의해결
기능 역학 부하 컨트롤러를 달성합니다. var DemoApp = angular.module('DemoApp',['ngRoute','ngCommon']); /* 调用动态注册方法,为当前模块添加动态注册方法 */ angular.module('ngCommon').setupRegister(DemoApp); DemoApp.config(['$routeProvider', '$routeResolverProvider', function ($routeProvider, $routeResolverProvider) { var route = $routeResolverProvider.route; $routeProvider.when('/index', route({ templateUrl: './view/index.html'), controller: 'IndexController', /* 在此申明了controller就不需要再html里面申明ng-controller了 */ controllerUrl: './controller/index.js') })) .otherwise('/index');/* ./controller/index.js */DemoApp.register.controller('IndexController', ['$scope', '$require', function($scope, $require) { ... /* 动态加载某个js文件 */ $require(url).then(function () { ... });}]);
ControllerChecker
, 현재 Controller가 등록되었는지 여부를 감지하는 데 사용됩니다. 등록되지 않은 경우 그런 다음 관련 js를 로드하고 새 컨트롤러를 등록합니다. 코드는 다음과 같습니다. rrreee
마지막으로 등록 방법을 추가해 보겠습니다. 🎜rrreee🎜기본적으로 완성인데 어떻게 사용하나요? 🎜rrreee🎜 🎜위 내용은 AngularJS에서 컨트롤러를 동적으로 로드하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!