[AngularJS] Best Practise - Resolve promises in router, defer controllers
See more: http://toddmotto.com/opinionated-angular-js-styleguide-for-teams/
/** * Created by Answer1215 on 1/13/2015. */ /** * Controller(s) * */ function AppController($rootScope, $location) { var appCtrl = this; $rootScope.$on('$routeChangeError', function(event, current, previous, rejection) { appCtrl.message = rejection.message; appCtrl.isError = true; }) appCtrl.goHome = function() { $location.path('/'); } } /** * Directive(s) * */ function ErrorDirective() { return { restrict: "EA", bindToController: true, controller: 'AppController', controllerAs: 'appCtrl', templateUrl: 'error.html' } } /** * Angular module * */ angular.module('app', [ 'ngRoute', 'app.home' ]) .constant('PEOPLE_URL', 'data.json') .controller('AppController', AppController) .directive('error', ErrorDirective) .config(function($routeProvider) { $routeProvider .when('/', { templateUrl: "home.html", controller: "HomeController", controllerAs: "homeCtrl", /* * resolve run first, prepare the data ready, * then controller & template show up * */ resolve: HomeController.resolve }); });
/** * Created by Answer1215 on 1/13/2015. */ function HomeController(loadPeople, getMessage) { var homeCtrl = this; homeCtrl.message = getMessage; homeCtrl.people = loadPeople; } HomeController.resolve = { loadPeople: function(SimpleDataService) { return SimpleDataService.getPeople(); }, getMessage : function(SimpleDataService) { return SimpleDataService.message; } } function SimpleDataService($http, $q, PEOPLE_URL) { var simpleData = {}; simpleData.people = []; simpleData.message = "Hello From Service"; simpleData.getPeople = function() { return fetchPeople().then(function(result) { return result.data; }); } function fetchPeople() { var defer = $q.defer(); $http.get(PEOPLE_URL) .success(function(data, status, headers, config) { simpleData.people = data; defer.resolve({data: data, message: "OK"}); }). error(function(data, status, headers, config) { if(status === 404){ data = data; defer.reject({data: data, message: "Cannot find " + config.url}); } }); return defer.promise; } return simpleData; } angular.module('app.home', []) .controller('HomeController', HomeController) .service('SimpleDataService', SimpleDataService);
While the routes are being resolved we want to show the user something to indicate progress. Angular will fire the $routeChangeStart
event as we navigate away from the page, which we can show some form of loading and ajax spinner, which can then be removed on the $routeChangeSuccess
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具