우리는 애플리케이션 페이지나 구성 요소가 데이터를 로드해야 할 때 브라우저와 Angular 모두 페이지를 렌더링하는 데 일정 시간이 걸린다는 것을 알고 있습니다. 여기의 간격은 너무 작아서 차이가 눈에 띄지 않을 수도 있고 길어서 사용자가 렌더링되지 않은 페이지를 보게 될 수도 있습니다.
이런 상황을 FOUC(Flash Of Unrendered Content)(K)라고 하나요? 아래에서는 이러한 일이 사용자에게 발생하지 않도록 방지하는 몇 가지 방법을 살펴보겠습니다.
1. 망토
ng-cloak 지시문은 Angular에 내장된 지시문으로, 그 기능은 포함된 모든 요소를 숨기는 것입니다.
<div ng-cloak> <h1>Hello {{ name }}</h1> </div>
Ng-cloak의 구현 원리는 지시어입니다. 페이지 초기화는 다음과 같이 DOM 헤더에 CSS 코드 한 줄을 추가하는 것입니다.
<pre class= “prettyprint linenums”> [ng\:cloak],[ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak{ Display:none ! important; }
[ng\:cloak],[ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak{ Display:none ! important; }
Angular는 ng-cloak으로 요소를 표시: 없음으로 설정합니다.
Angular가 ng-cloak으로 노드를 구문 분석할 때 해당 요소의 ng-cloak 속성과 calss를 동시에 제거하여 노드가 깜박이는 것을 방지합니다. 다음과 같습니다:
<script type =”text/ng-template” id =”scenario.js-150”> It(‘should remove the template directive and css class',function(){ Expect(element(‘.doc-example-live #template1').attr(‘ng-cloak')) not().toBeDefined(); Expect(element(‘.doc-example-live #template2').attr(‘ng-cloak')). Not().toBeDefined(); }); </script> <script type =”text/ng-template” id =”scenario.js-150”> It(‘should remove the template directive and css class',function(){ Expect(element(‘.doc-example-live #template1').attr(‘ng-cloak')) not().toBeDefined(); Expect(element(‘.doc-example-live #template2').attr(‘ng-cloak')). Not().toBeDefined(); }); </script>
2.ng-바인딩
ng-bind는 바인딩된 페이지 데이터를 작동하는 데 사용되는 Angular의 또 다른 내장 명령입니다. {{ }} 대신 ng-bind를 사용하여 요소를 페이지에 바인딩할 수 있습니다.
위의 예는 다음과 같이 다시 작성하여 {{ }}가 페이지에 표시되지 않도록 할 수 있습니다
<div> <h1>Hello <span ng-bind="name"></span></h1> </div>
3. 결심
다른 페이지 간에 경로를 사용할 때 데이터가 경로에 완전히 로드되기 전에 페이지가 렌더링되지 않도록 하는 또 다른 방법이 있습니다.
angular.module('myApp', ['ngRoute']) .config(function($routeProvider) { $routeProvider .when('/account', { controller: 'AccountCtrl', templateUrl: 'views/account.html', resolve: { // We specify a promise to be resolved account: function($q) { var d = $q.defer(); $timeout(function() { d.resolve({ id: 1, name: 'Ari Lerner' }) }, 1000); return d.promise; } } }) });
resolve는 해결 값이 해결되거나 거부된 Promise를 반환할 때 매우 유용합니다.
경로가 로드되면 해결 매개변수의 키를 주입 가능한 종속성으로 사용할 수 있습니다.
angular.module('myApp') .controller('AccountCtrl', function($scope, account) { $scope.account = account; });
angular.module('myApp', ['ngRoute']) .config(function($routeProvider) { $routeProvider .when('/account', { controller: 'AccountCtrl', templateUrl: 'views/account.html', resolve: { account: function($http) { return $http.get('http://example.com/account.json') } } }) });
먼저 accountService를 살펴보세요.
angular.module('app') .factory('accountService', function($http, $q) { return { getAccount: function() { var d = $q.defer(); $http.get('/account') .then(function(response) { d.resolve(response.data) }, function err(reason) { d.reject(reason); }); return d.promise; } } })
angular.module('myApp', ['ngRoute']) .config(function($routeProvider) { $routeProvider .when('/account', { controller: 'AccountCtrl', templateUrl: 'views/account.html', resolve: { // We specify a promise to be resolved account: function(accountService) { return accountService.getAccount() } } }) });