利用angular指令监听ng-repeat渲染完成后执行脚本

业务中有时须要在异步获取数据并用ng-repeat遍历渲染完页面后执行某个操做,angular自己并无提供监听ng-repeat渲染完成的指令,因此须要本身动手写。有经验的同窗都应该知道,在ng-repeat模板实例内部会暴露出一些特殊属性$index/$first/$middle/$last/$odd/$even,$index会随着每次遍历(从0开始)递增,当遍历到最后一个时,$last的值为true,so,经过判断$last的值来监听ng-repeat的执行状态,怎么在遍历过程当中拿到$last的值:自定义指令html

小实例,我只写了最重要的部分前端

复制代码
//要循环的数据
$scope.data = [
    {
        str: 'a'
    },
    {
        str: 'b'
    },
    {
        str: 'c'
    }
]
//自定义指令repeatFinish
app.directive('repeatFinish',function(){
    return {
        link: function(scope,element,attr){
            console.log(scope.$index)
            if(scope.$last == true){
                console.log('ng-repeat执行完毕')
            }
        }
    }
})
<div id="box">
    <span ng-repeat="item in data" repeat-finish>{{item.str}}</span>
</div>
复制代码

打开控制台,会打印出0,1,2,当$index = 2点时候,$last值为true,ng-repeat渲染完毕 app

so easy!异步

固然指令最好是可以复用,在这个指令内写具体的业务逻辑不利于复用,能够经过给指令指定一个处理函数renderFinish函数

<div id="box">
    <span ng-repeat="item in data" repeat-finish="renderFinish()">{{item.str}}</span>
</div>

再经过指令的attr参数获取这个处理函数spa

复制代码
app.directive('repeatFinish',function(){
    return {
        link: function(scope,element,attr){
            console.log(scope.$index)
            if(scope.$last == true){
                console.log('ng-repeat执行完毕')
                scope.$eval( attr.repeatFinish )
            }
        }
    }
})
//controller里对应的处理函数
$scope.renderFinish = function(){
    console.log('渲染完以后的操做')
}
复制代码

attr获取到的属性只是一个字符串表达式,$scope.$eval方法是专门执行AngularJS表达式的,经过它处理函数得以执行,这样,指令用在不一样的地方,可传递不一样的处理函数。code

有些业务比较复杂,可能ng-repeat渲染完成以后,须要执行多个操做而且这多个操做有多个前端完成,须要用到angular的事件,在repeatFinish指令的link函数内触发一个事件,各位前端同窗监听该事件完成各自的操做htm

复制代码
app.directive('repeatFinish',function(){
    return {
        link: function(scope,element,attr){
            console.log(scope.$index)
            if(scope.$last == true){
                console.log('ng-repeat执行完毕')
                //向父控制器传递事件
                scope.$emit('to-parent');
                //向子控制器传递事件
                scope.$broadcast('to-child');
            }
        }
    }
})
//父控制器中监听事件
$scope.$on('to-parent',function(){
    //父控制器执行操做
})

//子控制器中监听事件
$scope.$on('to-child',function(){
    //子控制器执行操做
})
复制代码

如何在当前控制器下监听到该事件呢?angular没有向当前控制器传递事件的方法,能够先向父(子)控制器传递事件,父(子)控制器监听到事件后反过来向子(父)控制器传递事件。blog

补充:IE8能够直接在元素上用指令ng-if="$last && renderFinish()",固然IE8+也能够这样用事件

一句话总结:指令是angular的核心功能之一,用好了事半功倍,监听ng-repeat执行状态仅仅是它功能的冰山一角吧

by:古德God http://www.cnblogs.com/wangmeijian/p/5141266.html

相关文章
相关标签/搜索