当ng repeat完成一个事件时触发它'’s的工作
Firing an event when ng-repeat has finished it's work
在ng repeat完成对dom的更改后,我需要更新特定元素的样式。这是我的挑战。当我向模型中添加项目时,我为激发重复工作而写的指令很好,但当我从项目中删除对象时,它不会被调用。
我添加了一个功能,可以从列表中随机推送和弹出数据。您将看到pop不会触发ng repeat指令调用。不管怎样,解决这个问题?
var module = angular.module('testApp', [])
.directive('onFinishRender', function ($timeout) {
return {
restrict: 'A',
link: function (scope, element, attr) {
if (scope.$last === true) {
scope.$evalAsync(attr.onFinishRender);
}
}
}
});
Fiddle Link
您可以这样做:
<p ng-repeat="t in ta" on-finish-render="test()"
ng-init="myFunction($last, t)">{{t}}</p>
$scope.myFunction = function(isLast, item){
if(isLast)
console.log(item)
}
ng-init
是在创建元素时运行的属性
如果当前元素是ng-repeat
中的最后一个元素,则$last
是true
的布尔值。
更新的Fiddle
为什么不使用$watch?
$scope.$watch('ta', function (newVal, oldValue) {
if(oldValue.length > 0)
{
var i = 0; // do something
}
}, true);
通过这种方式,您可以控制何时向数组中推送或弹出项目。
http://jsfiddle.net/W8nhv/114/
好吧,您将元素添加到数组中。因此,在渲染时,它肯定会触发自己的link()
函数。请记住,您为数组中的每个元素创建了一个onFinishRender
指令,该指令具有自己的作用域。
数组长度更改后,您想做什么?也许指令不是正确的尝试。
简单有效的方法
<li ng-repeat="data in dataList" ng-init="$last && $parent.myOnFinishHandler();" ></li>
$parent指向存储数据列表的范围
angular.module("abc", []).controller('mc', function($scope) {
$scope.dataList = ["abc", "123", "xyz", "orange", "apple"];
$scope.myHandler = function() {
console.log("render finish ");
}
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="abc">
<ul ng-controller="mc">
<li ng-repeat="data in dataList" ng-init="$last && $parent.myHandler();"> {{data}} </li>
</ul>
</div>
我发现解决方案在其他解决方案中四处寻找。
事实证明,没有好的方法来实现这一功能。我写了一个过滤器,它基本上做我想做的事情
app.filter('ngRepeatFinish', function($timeout){
return function(data, scope){
//var scope = this;
var flagProperty = '__finishedRendering__';
if(!data[flagProperty]){
Object.defineProperty(
data,
flagProperty,
{enumerable:false, configurable:true, writable: false, value:{}});
$timeout(function(){
delete data[flagProperty];
scope.$emit('ngRepeatFinished');
},0,false);
}
return data;
};
})
上面的过滤器为创建的每个元素广播,我可以根据控制器中的侦听事件运行我的手表。
$scope.$on('ngRepeatFinished', function() {
//Work thy magic
})
要调用这个指令,我必须从HTML传递作用域,并且我通过ngRepeatFinish前面的this来完成。
<div ng-repeat="item in (items | ngRepeatFinish:this)"></div>
相关文章:
- Jquery.点击事件不'更改事件后无法工作
- 当我更改innerHtml时,引导选项卡事件不再工作
- IE8更改文本区域上的事件侦听器不工作
- xPages标签onclick事件不'不要在空白处工作
- 为什么此事件侦听器不工作
- 主干点击事件按钮不工作
- 为什么动态加载的事件在我的代码中不能正常工作
- onbeforeunload事件在我的代码中没有触发,但其他示例可以工作
- 谷歌分析跟踪内部链接不正常工作的事件
- java脚本点击事件处理程序不工作
- javascript中无法正常工作的事件顺序
- MS Dynamics CRM 2016-addOnKeyPress事件不工作
- dropable的Over事件是't工作正常,在可拖动对象被拖放到贪婪的可拖动对象上并再次拖动后
- jQuery点击()事件在另一个点击()中获胜'我不能在手机上工作
- 如何使参数在事件函数中工作
- JavaScript's onmouseout事件未按预期工作
- CSS + jQ插件阻止AJAX调用/事件侦听器工作
- JavaScript on Click 事件在 img 标签上无法正常工作
- 脚本在“点击”下工作事件,但不是单独的(Backbone.js)
- 一些javascript代码不工作-事件处理程序'onclick'中的if()语句