Angular 指令不评估 ng-repeat 内部

angularjs

1个回答

写回答

13034020390

2025-06-25 00:10

+ 关注

Java
Java

Angular是一种流行的前端框架,它的指令功能非常强大。然而,有一点需要注意的是,Angular指令不会评估ng-repeat内部的内容。这意味着在ng-repeat指令中使用的表达式不会被Angular解析和执行。

案例代码:

假设我们有一个简单的数组,我们想使用ng-repeat指令来显示它的内容,同时在每个元素旁边添加一个按钮。当按钮被点击时,我们希望能够执行一些操作。

html

<div ng-app="myApp" ng-controller="myCtrl">

<div ng-repeat="item in items">

{{ item }}

<button ng-click="doSomething()">点击我</button>

</div>

</div>

Javascript

angular.module('myApp', [])

.controller('myCtrl', function($scope) {

$scope.items = ['Apple', 'Banana', 'Orange'];

$scope.doSomething = function() {

console.log('按钮被点击了!');

};

});

在上面的代码中,我们使用ng-repeat指令来循环显示items数组中的每个元素。然后,我们在每个元素旁边添加了一个按钮,并为按钮添加了一个ng-click指令,以便在点击按钮时执行doSomething函数。

然而,需要注意的是,无论我们如何修改doSomething函数的内容,它都不会在ng-repeat内部的每个元素上执行。换句话说,当我们点击按钮时,控制台不会输出任何东西。

解决方案:

为了解决这个问题,我们可以使用自定义指令来包装ng-repeat内部的内容,并在每个元素中执行我们想要的操作。让我们来看一个例子。

html

<div ng-app="myApp" ng-controller="myCtrl">

<div my-repeat="item in items">

{{ item }}

<button ng-click="doSomething()">点击我</button>

</div>

</div>

Javascript

angular.module('myApp', [])

.controller('myCtrl', function($scope) {

$scope.items = ['Apple', 'Banana', 'Orange'];

$scope.doSomething = function() {

console.log('按钮被点击了!');

};

})

.directive('myRepeat', function() {

return {

restrict: 'A',

link: function(scope, element, attrs) {

scope.$watch(attrs.myRepeat, function() {

element.children().remove();

angular.forEach(scope.$eval(attrs.myRepeat), function(item) {

var newItem = element.clone();

newItem.contents().appendTo(element);

scope.$apply();

});

});

}

};

});

在上面的代码中,我们创建了一个名为myRepeat的自定义指令。该指令在link函数中使用$watch来监视ng-repeat表达式,并在表达式有任何变化时执行一些操作。在这个例子中,我们简单地将原始的ng-repeat元素克隆并添加到父元素中。

通过使用自定义指令来包装ng-repeat内部的内容,我们可以确保我们的操作在每个元素上执行。现在,当我们点击按钮时,控制台将输出"按钮被点击了!"。

:

尽管Angular的指令功能非常强大,但需要注意的是,它不会评估ng-repeat内部的内容。为了解决这个问题,我们可以使用自定义指令来包装ng-repeat,并在每个元素上执行我们想要的操作。这样,我们就可以在ng-repeat内部使用表达式,并且能够对每个元素进行评估和操作。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号