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配合,我们可能需要监听jQuery事件,如`on('changeDate')`,并在事件触发时更新AngularJS模型。 - **配置和本地化**:Datepicker有...
4. **事件处理**:监听地图和控件的事件,如点击、移动、缩放等,然后在AngularJS上下文中响应这些事件,更新模型或者执行其他操作。 5. **指令选项**:提供一组可配置的选项,允许用户在使用指令时自定义地图的行为...
而`$render`则是在模型已更新后,强制视图进行同步。所以,`$render`更多的是用于自定义指令或外部事件中,确保模型变更能正确反映到视图上。 总结起来,`ngModel`的`$render`方法在AngularJS中扮演着视图更新的...
在这篇文章中,我们要讲述如何利用AngularJS的Directive功能来自定义一个表格。 首先,我们要明确什么是AngularJS中的Directive。Directive是AngularJS的最小指令性组件,它可以通过添加属性、元素、注释、或者类来...
4. **高性能**:JsRender 的设计目标之一就是提供高性能,它在处理大量数据时能够保持快速渲染。 5. **与jQuery集成**:虽然JsRender可以独立使用,但它与jQuery有很好的集成,可以方便地与jQuery插件和方法一起...
一键将角色的Animator或Animation去掉,将SkinnedMeshRender更换为一般的Mesh Render,完成将动画效果的实现从CPU转移到GPU运算的目的,来利用GPU Instancing技术减少Draw Call。 • Convert assets quickly and ...
在提供的文件列表中,`jsrender.js` 应该是 JSRender 的核心库,而 `jquery-jsrender.js` 是将其功能整合到 jQuery 中的扩展插件。使用这个插件,开发者可以直接通过 jQuery 对象调用 `$.render` 或 `$.templates` ...
为您列举一些renderDoc方面的下载的内容,renderdoc教程、render doc安装、renderdoc plugin等资源。把最新最全的renderDoc推荐给您,让您轻松找到相关应用信息,并提供renderDoc下载等功能。本站致力于为用户提供更好...
JsRender 是一个轻量级但功能强大的JavaScript模板引擎,由Microsoft的Dean Edwards开发,用于在客户端进行数据绑定和渲染。它提供了简洁、易于学习的语法,使得开发者能够快速地将静态HTML模板转化为动态、数据驱动...
在本文中,我们将详细探讨`render`属性在RichFaces 4中的使用,特别是如何利用它来更新页面上的特定区域。 `render`属性通常用于AJAX(异步JavaScript和XML)操作,它允许我们在用户与页面交互时,只更新页面的某些...
**JSRender:强大的JavaScript模板引擎** JSRender是一个轻量级但功能强大的JavaScript模板引擎,它由Microsoft的MVC团队成员Boris Moore开发。这个库旨在提供一个简洁、高效的模板解决方案,用于生成动态HTML和XML...
6. **事件处理**:在 `render` 函数内,我们需要手动处理事件绑定,比如上面的输入事件监听器,这与模板语法中的 `v-on` 指令不同。 总之,Vue的 `render` 函数提供了更底层的控制力,适合处理复杂或特定的渲染逻辑...
在实例化时,componentWillMount 执行完成后就会执行 render。在存在期,render 执行是由以下几个方法所控制的:componentWillReceiveProps、shouldComponentUpdate、componentWillUpdate、render 和 ...
2. **RenderFeature生命周期**:掌握`OnEnable`,`OnDisable`,`OnExecute`等生命周期方法,知道在何时何地执行自定义的渲染逻辑。 3. **渲染队列管理**:理解如何通过`renderQueue`设置渲染顺序,以确保不同的特效...
当涉及到基类(如BasePage)或母版页(MasterPage)时,事件顺序会有微调,基类和子类的事件将依次触发,母版页的事件会在内容页之前执行。这种机制使得开发者能够方便地在基类中进行全局设置,如权限检查,同时在...
在AngularJS中,有时我们需要集成第三方的UI控件来增强应用的功能和用户体验。layDate是一款常用的JavaScript日期插件,提供丰富的日期选择功能。在本文中,我们将探讨如何在AngularJS项目中集成layDate日期控件。 ...
在Vue.js框架中,`props`是父组件向子组件传递数据的一种机制,而`render`函数则是Vue中用于自定义渲染逻辑的关键工具。本文将深入探讨如何利用`props`和`render`函数来实现组件之间的动态嵌套,从而提高应用的灵活...
指令的`link`函数检查`scope.$last`属性,如果其值为`true`,表示当前迭代是数组的最后一个元素,这时调用`$timeout`服务确保在AngularJS的下一个事件循环中执行回调,即`scope.$emit('ngRepeatFinished')`。...
6. **Page.LoadComplete**:Load事件处理完成后,LoadComplete事件被触发,此时可以进行任何需要在数据加载后完成的操作。 7. **Page.PreRender**:在页面呈现之前,PreRender事件允许对页面做最后的修改。母版页的...
\Program Files\Google\Google SketchUp 8\Plugins\Renderin目录下替换原文件,打开SU8在插件下Renderin菜单点License,在弹出的窗口输入号码,点Apply等一会在输入框下面出现一段英文后按回车键,好了,渲染一下看...