`

AngularJS之事件之 $timeout 之在 ngRepeat render 完成后再执行

阅读更多
AngularJS之事件之 $timeout 之在 ngRepeat render 完成后再执行

使用 ng-repeat 指令时,在很多情况下,需要在其 render 完成后对 DOM 元素添加一些事件,如绑定 click 事件等。

一、ng-repeat 使用背景
使用 ng-repeat,AngularJs会遍历users数据对象,来 render 渲染出这个table中的内容。
<table>
    <thead>
        <tr>
            <th>Id</th> <th>Name</th> <th>Salary</th>
        </tr>
    </thead>
    <tbody>
        <tr ng-repeat="user in users">
            <td>{{user.Id}}</td>
            <td>{{user.Name}}</td>
            <td>{{user.Salary}}</td>
        </tr>
    </tbody>
</table>




二、使用 $timeout 实现在render完成之后,执行Js脚本

说明:这里会用到:自定义指令、 $timeout、 link 函数,详细介绍请自行查阅官方文档。

$timeout : 不会执行,直到元素存在。

第一步:为当前的 app 自定义一个 directive
app.directive('onRendered', function ($timeout) {
    return {
        restrict: 'A',
        link: function(scope, element, attr) {
            if (scope.$last === true) {
                $timeout(function() {
                    scope.$emit('event-ngRepeat-finished');
                });
            }
        }
    };
});



第二步:在需要监听的地方加上该 directive
<tr ng-repeat="user in users" on-rendered>
      <td>{{user.Id}}</td>
      <td>{{user.Name}}</td>
      <td>{{user.Salary}}</td>
</tr>



第三步:为自定义事件添加触发执行函数
$scope.$on('event-ngRepeat-finished', function (event) {
    // write your code here.
});




三、用法举例

<ul ng-controller="MyCtrl">
    <li ng-repeat="item in items" 
        on-finish-render="callMyCustomMethod()"
        on-start-render="callMyCustomMethod2()">
        {{item}}
    </li>
</ul>


var myApp = angular.module('myApp', []);

//myApp.directive('myDirective', function() {});
//myApp.factory('myService', function() {});

myApp.directive('onFinishRender', ['$timeout', '$parse', function ($timeout, $parse) {
    return {
        restrict: 'A',
        link: function (scope, element, attr) {
            if (scope.$last === true) {
                $timeout(function () {
                    scope.$emit('ngRepeatFinished');
                    if ( !! attr.onFinishRender) {
                        $parse(attr.onFinishRender)(scope);
                    }
                });
            }




            if (!!attr.onStartRender) {
                if (scope.$first === true) {
                    $timeout(function () {
                        scope.$emit('ngRepeatStarted');
                        if ( !! attr.onStartRender) {
                            $parse(attr.onStartRender)(scope);
                        }
                    });
                }
            }
        }
    }
}]);

myApp.controller('MyCtrl', function($scope){
    $scope.items = [
        "lorem", "ipsum", "dolor", 
        "sit", "amet,", "consectetur", "adipiscing"
    ];

    $scope.callMyCustomMethod = function () {
        console.log('Method called by the directive, when finished rendering');
    }
    $scope.callMyCustomMethod2 = function () {
        console.log('Method2 called by the directive, when starting rendering');
    }

    $scope.$on('ngRepeatFinished', function (ngRepeatFinishedEvent) {
        console.log('Event captured in the controller, when finished rendering');
    });
    $scope.$on('ngRepeatStarted', function (ngRepeatStartedEvent) {
        console.log('Event captured in the controller, when started rendering');
    });
});






转载请注明,
原文出处: http://lixh1986.iteye.com/blog/2429307
















引用:
https://stackoverflow.com/questions/20155733
https://github.com/angular/angular.js/issues/734
http://www.jomendez.com/2015/02/05/ng-repeat-onfinishrender-directive-angularjs/


-
分享到:
评论

相关推荐

    AngularJS封装jQuery Datepicker

    - **事件处理**:AngularJS 提供了自己的事件处理机制,但为了与jQuery Datepicker配合,我们可能需要监听jQuery事件,如`on('changeDate')`,并在事件触发时更新AngularJS模型。 - **配置和本地化**:Datepicker有...

    angularjs与openlayers3自定义控件

    4. **事件处理**:监听地图和控件的事件,如点击、移动、缩放等,然后在AngularJS上下文中响应这些事件,更新模型或者执行其他操作。 5. **指令选项**:提供一组可配置的选项,允许用户在使用指令时自定义地图的行为...

    浅谈Angular中ngModel的$render

    而`$render`则是在模型已更新后,强制视图进行同步。所以,`$render`更多的是用于自定义指令或外部事件中,确保模型变更能正确反映到视图上。 总结起来,`ngModel`的`$render`方法在AngularJS中扮演着视图更新的...

    AngularJS中的Directive自定义一个表格

    在这篇文章中,我们要讲述如何利用AngularJS的Directive功能来自定义一个表格。 首先,我们要明确什么是AngularJS中的Directive。Directive是AngularJS的最小指令性组件,它可以通过添加属性、元素、注释、或者类来...

    JsRender.zip(jsrender.js和jsrender.min.js合集)

    4. **高性能**:JsRender 的设计目标之一就是提供高性能,它在处理大量数据时能够保持快速渲染。 5. **与jQuery集成**:虽然JsRender可以独立使用,但它与jQuery有很好的集成,可以方便地与jQuery插件和方法一起...

    将角色的Animator或Animation去掉,将SkinnedMeshRender更换为一般的Mesh Render,只使用

    一键将角色的Animator或Animation去掉,将SkinnedMeshRender更换为一般的Mesh Render,完成将动画效果的实现从CPU转移到GPU运算的目的,来利用GPU Instancing技术减少Draw Call。 • Convert assets quickly and ...

    jquery-jsrender.js

    在提供的文件列表中,`jsrender.js` 应该是 JSRender 的核心库,而 `jquery-jsrender.js` 是将其功能整合到 jQuery 中的扩展插件。使用这个插件,开发者可以直接通过 jQuery 对象调用 `$.render` 或 `$.templates` ...

    RenderDoc 1.19 64位 Windows下载

    为您列举一些renderDoc方面的下载的内容,renderdoc教程、render doc安装、renderdoc plugin等资源。把最新最全的renderDoc推荐给您,让您轻松找到相关应用信息,并提供renderDoc下载等功能。本站致力于为用户提供更好...

    JsRender 的使用demo

    JsRender 是一个轻量级但功能强大的JavaScript模板引擎,由Microsoft的Dean Edwards开发,用于在客户端进行数据绑定和渲染。它提供了简洁、易于学习的语法,使得开发者能够快速地将静态HTML模板转化为动态、数据驱动...

    render标签的使用

    在本文中,我们将详细探讨`render`属性在RichFaces 4中的使用,特别是如何利用它来更新页面上的特定区域。 `render`属性通常用于AJAX(异步JavaScript和XML)操作,它允许我们在用户与页面交互时,只更新页面的某些...

    jsrender.js

    **JSRender:强大的JavaScript模板引擎** JSRender是一个轻量级但功能强大的JavaScript模板引擎,它由Microsoft的MVC团队成员Boris Moore开发。这个库旨在提供一个简洁、高效的模板解决方案,用于生成动态HTML和XML...

    Vue Render函数创建DOM节点代码实例

    6. **事件处理**:在 `render` 函数内,我们需要手动处理事件绑定,比如上面的输入事件监听器,这与模板语法中的 `v-on` 指令不同。 总之,Vue的 `render` 函数提供了更底层的控制力,适合处理复杂或特定的渲染逻辑...

    React中的render何时执行过程

    在实例化时,componentWillMount 执行完成后就会执行 render。在存在期,render 执行是由以下几个方法所控制的:componentWillReceiveProps、shouldComponentUpdate、componentWillUpdate、render 和 ...

    RF_URP/RenderFeature_

    2. **RenderFeature生命周期**:掌握`OnEnable`,`OnDisable`,`OnExecute`等生命周期方法,知道在何时何地执行自定义的渲染逻辑。 3. **渲染队列管理**:理解如何通过`renderQueue`设置渲染顺序,以确保不同的特效...

    aspx页面事件执行顺序

    当涉及到基类(如BasePage)或母版页(MasterPage)时,事件顺序会有微调,基类和子类的事件将依次触发,母版页的事件会在内容页之前执行。这种机制使得开发者能够方便地在基类中进行全局设置,如权限检查,同时在...

    Angularjs中使用layDate日期控件示例

    在AngularJS中,有时我们需要集成第三方的UI控件来增强应用的功能和用户体验。layDate是一款常用的JavaScript日期插件,提供丰富的日期选择功能。在本文中,我们将探讨如何在AngularJS项目中集成layDate日期控件。 ...

    vue props传入render函数,实现动态组件嵌套

    在Vue.js框架中,`props`是父组件向子组件传递数据的一种机制,而`render`函数则是Vue中用于自定义渲染逻辑的关键工具。本文将深入探讨如何利用`props`和`render`函数来实现组件之间的动态嵌套,从而提高应用的灵活...

    详解angular中如何监控dom渲染完毕

    指令的`link`函数检查`scope.$last`属性,如果其值为`true`,表示当前迭代是数组的最后一个元素,这时调用`$timeout`服务确保在AngularJS的下一个事件循环中执行回调,即`scope.$emit('ngRepeatFinished')`。...

    专题资料(2021-2022年)ASPNET页面事件执行过程.doc

    6. **Page.LoadComplete**:Load事件处理完成后,LoadComplete事件被触发,此时可以进行任何需要在数据加载后完成的操作。 7. **Page.PreRender**:在页面呈现之前,PreRender事件允许对页面做最后的修改。母版页的...

    render in 软件及注册

    \Program Files\Google\Google SketchUp 8\Plugins\Renderin目录下替换原文件,打开SU8在插件下Renderin菜单点License,在弹出的窗口输入号码,点Apply等一会在输入框下面出现一段英文后按回车键,好了,渲染一下看...

Global site tag (gtag.js) - Google Analytics