강좌 & 팁
글 수 2,412
2015.03.13 18:03:29 (*.134.169.166)
41917
01. Binding : http://forum.falinux.com/zbxe/index.php?document_srl=804623
02. Controller : http://forum.falinux.com/zbxe/index.php?document_srl=804950
03. controller 사이의 데이터 공유 : http://forum.falinux.com/zbxe/index.php?document_srl=805325
04. controller에 메소드 만들기 : http://forum.falinux.com/zbxe/index.php?document_srl=805915
05. Filter : http://forum.falinux.com/zbxe/index.php?document_srl=806499
06. ng-repeat와 filter의 응용 : http://forum.falinux.com/zbxe/index.php?document_srl=806788
07. Directive : http://forum.falinux.com/zbxe/index.php?document_srl=807545
08. Directive #2 : http://forum.falinux.com/zbxe/index.php?document_srl=808009
09. $scope? scope? : http://forum.falinux.com/zbxe/index.php?document_srl=818891
10. templateUrl 사용하기 : http://forum.falinux.com/zbxe/index.php?document_srl=826765
11. routeProvider 사용하기 : http://forum.falinux.com/zbxe/index.php?document_srl=828375
12. routeProvider 사용하기 #2 : http://forum.falinux.com/zbxe/index.php?document_srl=828883
13. promise 사용하기 : http://forum.falinux.com/zbxe/index.php?document_srl=830819
지난 글에서 promise를 사용하는 것에 대해서 간단하게 알아보았습니다.
이번에는 좀 더 구체적으로, 실무에서 사용할만한 방법들을 알아보겠습니다.
지난번에 만들었던 public/index.html과 public/javascripts/main.js 두개를 그대로 활용하겠습니다.
public/javasciprts/main.js를 아래와 같이 수정합니다.
var app = angular.module("app", ['ngRoute']); app.config(function($routeProvider) { $routeProvider.when('/', { templateUrl: "app.html", controller: "AppCtrl", resolve: { app: function($q) { var defer = $q.defer(); defer.resolve(); return defer.promise; } } }); }); app.controller('AppCtrl', function ($scope, $route) { $scope.model = { message: "This is my app!!!" } })
여기서 resolve를 2초 뒤에 하도록 살짝 수정합니다.
var app = angular.module("app", ['ngRoute']); app.config(function($routeProvider) { $routeProvider.when('/', { templateUrl: "app.html", controller: "AppCtrl", resolve: { app: function($q, $timeout) { var defer = $q.defer(); $timeout(function() { defer.resolve(); }, 2000); return defer.promise; } } }); }); app.controller('AppCtrl', function ($scope, $route) { $scope.model = { message: "This is my app!!!" } })
이렇게 하면 2초 뒤에 This is my app!!!이라는 메시지가 뜨면서 로딩이 끝이 납니다.
항상 그렇지만 한 부분에 너무 많은 코드가 들어가있으면 복잡해집니다. resolve 부분을 좀 더 간단하게 만들어봅시다.
var app = angular.module("app", ['ngRoute']); app.config(function($routeProvider) { $routeProvider.when('/', { templateUrl: "app.html", controller: "AppCtrl", resolve: { loadData: appCtrl.loadData } }); }); var appCtrl = app.controller('AppCtrl', function ($scope, $route) { $scope.model = { message: "This is my app!!!" } }) appCtrl.loadData = function($q, $timeout) { var defer = $q.defer(); $timeout(function() { defer.resolve(); }, 2000); return defer.promise; }
이렇게 실제 선언부를 분리를 시켰습니다.
resolve할 때 여러 동작을 할 수도 있습니다.
var app = angular.module("app", ['ngRoute']); app.config(function($routeProvider) { $routeProvider.when('/', { templateUrl: "app.html", controller: "AppCtrl", resolve: { loadData: appCtrl.loadData, prepData: appCtrl.prepData, } }); }); var appCtrl = app.controller('AppCtrl', function ($scope, $route) { $scope.model = { message: "This is my app!!!" } }) appCtrl.loadData = function($q, $timeout) { var defer = $q.defer(); $timeout(function() { defer.resolve(); console.log("loadData"); }, 2000); return defer.promise; } appCtrl.prepData = function($q, $timeout) { var defer = $q.defer(); $timeout(function() { defer.resolve(); console.log("prepData"); }, 2000); return defer.promise; }
크롬 개발자 도구로 보면 loadData와 prepData가 출력되는 것을 확인할 수 있습니다.
이제 실제 resolve할때 얻은 데이터를 controller에서 사용해보겠습니다.
var app = angular.module("app", ['ngRoute']); app.config(function($routeProvider) { $routeProvider.when('/', { templateUrl: "app.html", controller: "AppCtrl", resolve: { loadData: appCtrl.loadData, prepData: appCtrl.prepData, } }); }); var appCtrl = app.controller('AppCtrl', function ($scope, $route) { console.log($route.current.locals.loadData); console.log($route.current.locals.prepData); $scope.model = { message: "This is my app!!!" } }) appCtrl.loadData = function($q, $timeout) { var defer = $q.defer(); $timeout(function() { defer.resolve("loadData"); }, 2000); return defer.promise; } appCtrl.prepData = function($q, $timeout) { var defer = $q.defer(); $timeout(function() { defer.resolve("prepData"); }, 2000); return defer.promise; }
결과는 똑같지만 loadData와 prepData를 controller가 받아서 출력하게 되었습니다.
이렇게 promise를 사용하면 초기 데이터를 처리하는 부분을 매끄럽게 처리할 수 있습니다.