Angularjs – 隐藏内容,直到DOM加载

我在Angularjs中遇到了一个问题,在我的数据从服务器返回之前,在我的HTML中闪烁。

这里是一个video,演示了这个问题:http: //youtu.be/husTG3dMFOM – 注意#| 和灰色地带的权利。

我已经尝试ngCloak没有成功(虽然ngCloak确实防止括号出现承诺),并想知道隐藏内容的最佳方式,直到HTML已由Angular填充。

我在我的控制器中使用了这个代码:

var caseCtrl = function($scope, $http, $routeParams) { $('#caseWrap').hide(); // hides when triggered using jQuery var id = $routeParams.caseId; $http({method: 'GET', url: '/v1/cases/' + id}). success(function(data, status, headers, config) { $scope.caseData = data; $('#caseWrap').show(); // shows using jQuery after server returns data }). error(function(data, status, headers, config) { console.log('getCase Error', arguments); }); } 

…但我一次又一次听到不要操纵控制器的DOM。 我的问题是我怎样才能实现这个使用指令? 换句话说,如何隐藏指令所附的元素,直到从服务器加载所有内容为止?

在你的CSS中添加:

 [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak { display: none !important; } 

只需在这里添加一个“ ng-cloak ”属性给你的div:

 <div id="template1" ng-cloak>{{scoped_var}}<div> 

doc: https : //docs.angularjs.org/api/ng/directive/ngCloak

在你的caseWrap元素上,放ng-show="contentLoaded" ,然后你现在有$('#caseWrap').show();$scope.contentLoaded = true;

如果caseWrap元素在此控制器之外,则可以使用$ rootScope或events执行相同的操作。

将以下内容添加到您的CSS:

 [ng\:cloak],[ng-cloak],.ng-cloak{display:none !important} 

你的angular模板的编译不够快。

UPDATE

你不应该在你的控制器中进行DOM操作。 有两件事你可以做… 1.你可以通过一个指令拦截控制器范围内的值的变化! 在你的情况下,创build一个指令作为一个属性分配你想要观看的属性。 在你的情况下,这将是caseData 。 如果casedata是虚假的,隐藏它。 否则,显示它。

  1. 更简单的方法是使用ngShow ='casedata'。

 var myApp = angular.module('myApp', []); myApp.controller("caseCtrl", function ($scope, $http, $routeParams, $timeout) { $scope.caseData = null; //mimic a delay in getting the data from $http $timeout(function () { $scope.caseData = 'hey!'; }, 1000); }) .directive('showHide', function () { return { link: function (scope, element, attributes, controller) { scope.$watch(attributes.showHide, function (v) { if (v) { element.show(); } else { element.hide(); } }); } }; }); 

HTML

 <div ng-controller='caseCtrl' show-hide='caseData'>using directive</div> <div ng-controller='caseCtrl' ng-show='caseData'>using ngShow</div> 

JSFIDDLE: http : //jsfiddle.net/mac1175/zzwBS/

既然你问了一个指令,试试这个。

 .directive('showOnLoad', function() { return { restrict: 'A', link: function($scope,elem,attrs) { elem.hide(); $scope.$on('show', function() { elem.show(); }); } } }); 

在元素中粘贴(show-on-load),并在控制器中注入$ rootScope,并在加载html时使用这个广播事件。

 $rootScope.$broadcast('show'); 

我用Zack的回应来创build一个“加载”指令,这可能对一些人有用。

模板:

 <script id="ll-loading.html" type="text/ng-template"> <div layout='column' layout-align='center center'> <md-progress-circular md-mode="indeterminate" value="" md-diameter="52"></md-progress-circular> </div> </script> 

指示:

  directives.directive('loading', function() { return { restrict: 'E', template: 'll-loading.html', link: function($scope,elem,attrs) { elem.show(); $scope.$on('loaded', function() { console.log("loaded: "); elem.hide(); }); } } }); 

这个例子在html中使用了angular-material

接受的答案不适合我。 我有一些有ng-show指令的元素,即使用ng-cloak,元素也会瞬间显示出来。 在ng-show返回false之前,ng-cloak似乎已经解决了。 将ng-hide类添加到我的元素解决了我的问题。