lizean 2015-03-10
angularjs 渲染页面时,有时需要根据远程接口返回的数据结构来渲染:
请求远程数据--》数据模型变化--》angularjs监控到模型变化--》重新渲染页面。
那么有时需要在有数据且页面被渲染完成后,再执行某个方法,如:
semnatic 的 accrodion:
<div class="ui accordion">
    <div class="active title">
      <i class="dropdown icon"></i>
      菜单名称
    </div>
    <div class="active content">
     	<ul >
     	<li><a href="">菜单1</a>
     	<li><a href="">菜单2</a>
     	<li><a href="">菜单3</a>
     	<li><a href="">菜单4</a>
     	</ul>
    </div>
     <div class=" title">
      <i class="dropdown icon"></i>
      菜单名称
    </div>
    <div class=" content">
     	<ul >
     	<li><a href="">菜单1</a>
     	<li><a href="">菜单2</a>
     	<li><a href="">菜单3</a>
     	<li><a href="">菜单4</a>
     	</ul>
    </div>
  
  </div>
<script>
$('.ui.accordion') .accordion();
</script>需要执行accordion 方法才能显示出来。
通常菜单由数据来决定,改为angularjs 实现为:
<div  ng-if="userModel.menuList.length>0" class="ui accordion " >
        <div ng-repeat="menuDir in userModel.menuList" >
                <div class="{{$first?'active':''}} title">
                    <i class="dropdown icon"></i>
                     {{menuDir.menuName}} 
                </div>
                <div class="{{$first?'active':''}} content">
                    <ul ng-repeat="menu in menuDir.childrens">
                      <li ><a ui-sref="/views/{{menu.menuUrl}}"> {{menu.menuName}}</a></li>
                    </ul>
                </div>
            </div>
        </div>页面在加载完后台数据,生成userModel.menuList数据,angularjs 监控到userModel.menuList数据变化,再渲染页面,在这执行完成后,再执行$('.ui.accordion') .accordion();,才能渲染出accordion校果。
那么如何实现在页面angularjs 渲染完成后,再执行方法呢?
一种指令实现的方式:
.directive('OnReanderFinsh',[function(){
        return {
            restrict:'A',
            link:function ($scope, element, attrs, controller) {
                var fun = $scope.$eval(attrs.OnReanderFinsh);//计算表达式的值
                if(fun && typeof(fun)=='function'){
                    fun();
                }
            }
        };
    }]);html页中引入指令的js,在 ng-repeat一行中修改:
<div ng-repeat="menuDir in userModel.menuList" on-reander-finsh="renderAccordion">
controller中修改:
$scope.renderAccordion = function (){
            $('.ui.accordion') .accordion();
        };就是利用了一个指令完成(ng-repeat 渲染完成),再执行下一个指令的渲染顺序,来实现的。
问题描述在编写导入指令的时候,需要将函数绑定到指令中,并传入一个参数。<button ng-hide="importing" class="btn btn-warning btn-sm" type="