我想提供一个加载指示,只要指令还没有完成加载页面上的所有子元素。
我的应用程序的这一部分有标签,当点击将加载标签内容。我的问题是,一些选项卡的内容需要很长时间来渲染。
我以为是我的HTTP请求导致了渲染的延迟,并求助于使用自定义承诺,但在实现之后,我发现实际上是指令的DOM渲染花了这么长时间。
如果我想在此指令内呈现所有内容之前显示加载指示器,那么在指令中收听的正确事件是什么?据我所知,$viewContentLoaded
只用于ngView
指令,但这个指令是ngView的子指令,所以它不适用(我认为)。
代码非常基本:
控制器:
angular.module('app', [])
.controller('MyController', ['$scope', 'Service', function($scope, Service) {
$scope.get_data = function(user) {
Service.getsomething(user).then(function(response) {
$scope.data = response.data;
},
function(error) {
console.log(error);
});
};
}])
.directive('tab', function() {
return {
restrict: 'E',
templateUrl: 'templates/tab.html'
};
})
HTML:
<div role="tabpanel">
<ul class="nav nav-pills col-lg-9 col-lg-offset-3" role="tablist">
<li toggle-tabs class="active">
<a href="#apanel">Panel</a>
</li>
</ul>
<div class="tab-content col-lg-12">
<tab></tab> //within here there are many forms
</div>
</div>
angular.module('app').directive('tab', function($timeout, $rootScope) {
return {
restrict: 'E',
templateUrl: 'templates/tab.html',
link: function (scope, element, attrs, ctrl) {
$timeout(function () {
$rootScope.$emit('directive-dom-is-most-likely-there');
});
}
};
});
当link
运行时,你不能确定DOM在那里,它取决于嵌套指令的实现(例如,ng-repeat
已知是一个晚开者)。要么你不能确定他们都没有异步的东西,需要一些时间来完成,但$timeout
与零延迟是ok的化妆品的东西。
这取决于上下文,当你可以用require
与父指令交谈时,没有必要污染$rootScope
。