アプリケーション ページまたはコンポーネントがデータをロードする必要がある場合、ブラウザーと Angular の両方がページをレンダリングするのに一定の時間がかかることがわかっています。ここでのギャップは非常に小さいため、違いが目立たない場合もあります。また、ギャップが長いため、ユーザーにはレンダリングされないページが表示される場合もあります。
この状況は、Flash Of Unrendered Content (FOUC) (K) と呼ばれます。これは常に望ましくないことです。以下では、これがユーザーに起こらないようにするためのいくつかの方法を説明します。
1. ng-マント
ng-cloak ディレクティブは Angular の組み込みディレクティブであり、その機能はそれに含まれるすべての要素を非表示にすることです。
<div ng-cloak> <h1>Hello {{ name }}</h1> </div>
<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 を使用してノードを解析すると、ng-cloak 属性が削除され、同時に要素が実行されるため、ノードのちらつきが防止されます。以下のように:
<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>
ng-bind は、バインドされたページ データを操作するために使用される、Angular の別の組み込み命令です。 {{ }} の代わりに ng-bind を使用して要素をページにバインドできます。
{{ }} の代わりに ng-bind を使用すると、レンダリングされていない {{ }} がユーザーに表示されないようにすることができます。{{ }} を置き換えるために ng-bind によってレンダリングされた空の要素を使用すると、より使いやすくなります。
<div> <h1>Hello <span ng-bind="name"></span></h1> </div>
異なるページ間でルートを使用する場合、データがルートに完全に読み込まれる前にページがレンダリングされないようにする別の方法があります。
ルートでresolveを使用すると、ルートが完全にロードされる前に、ロードする必要があるデータを取得できます。データが正常にロードされると、ルートが変更され、ページがユーザーに表示されます。データが正常にロードされない場合、ルートは変更されず、$routeChangeError イベントが発生します。活性化されますか? 】
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 パラメーター内のキーを注入可能な依存関係として使用できます。
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') } } }) });
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() } } }) });