ng-click 在 ng-repeat 中不起作用
ng-click is not working inside ng-repeat
我注意到其他人的反应是由于范围的原因而使用 $parent。我试过了,但出于某种原因,它并不总是被解雇。当状态变为活动状态时,事件可能会被触发或不会被触发。如果我切换列表中的最后一个,它不会触发。
控制器:
$scope.checkAndSave = function(todo, checked) {
$scope.save(todo);
};
html:
<li ng-repeat="todo in todos | filter:statusFilter track by $index" ng-class="{completed: todo.completed, editing: todo == editedTodo}">
<div class="view">
<input
class="toggle"
type="checkbox"
ng-model="todo.completed"
ng-click="checkAndSave(todo)">
<label ng-dblclick="edit(todo)">{{todo.title}}</label>
<button class="destroy" ng-click="remove(todo)"></button>
</div>
</li>
根据我对您代码的看法,我假设您是从数据库中获取待办事项。即使你不是,你也可以给每个待办事项一个唯一的 id(如果待办事项来自数据库,它已经存在)。然后,您可以将每个待办事项的 ID - (todo.id) 传递给点击功能。这现在可以用来识别被点击的特定待办事项(记住每个待办事项的 ID 都是唯一的)
希望这能解决问题。
您最好使用 ng-change
而不是 ng-click
。它的优点是函数将在更改发生后调用,而不是可能之前。
但是代码没有错并且确实有效,正如您在附加代码段中看到的那样(如果将 ng-change
替换为 ng-click
)仍然有效。所以你可能想更好地描述你的问题。
PS:作为旁注,您对 label
的使用是错误的,因为它没有连接到输入。相反,将 <label>
打开标记放在输入之前(或使用 for="inputId"
属性),这使您能够单击标签而不仅仅是复选框(并且有利于可访问性)
angular.module("test", []).controller("test", function($scope) {
$scope.todos = [
{title: 'todo #1', completed: false},
{title: 'todo #2', completed: false},
{title: 'todo #3', completed: false}
];
$scope.checkAndSave = function(todo) {
status = todo.completed ? 'checked' : 'unchecked';
alert(todo.title + ' has been ' + status);
}
});
li { list-style-type: none; margin: 5px; padding: 5px; background: #eee; font-family: monospace; width: 8em; border-radius: 6px; }
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="test" ng-controller="test">
<li ng-repeat="todo in todos track by $index">
<div class="view">
<label>
<input
class="toggle"
type="checkbox"
ng-model="todo.completed"
ng-change="checkAndSave(todo)">
{{todo.title}}</label>
</div>
</li>
</div>
我注意到其他人的反应是由于范围的原因而使用 $parent。我试过了,但出于某种原因,它并不总是被解雇。当状态变为活动状态时,事件可能会被触发或不会被触发。如果我切换列表中的最后一个,它不会触发。
控制器:
$scope.checkAndSave = function(todo, checked) {
$scope.save(todo);
};
html:
<li ng-repeat="todo in todos | filter:statusFilter track by $index" ng-class="{completed: todo.completed, editing: todo == editedTodo}">
<div class="view">
<input
class="toggle"
type="checkbox"
ng-model="todo.completed"
ng-click="checkAndSave(todo)">
<label ng-dblclick="edit(todo)">{{todo.title}}</label>
<button class="destroy" ng-click="remove(todo)"></button>
</div>
</li>
根据我对您代码的看法,我假设您是从数据库中获取待办事项。即使你不是,你也可以给每个待办事项一个唯一的 id(如果待办事项来自数据库,它已经存在)。然后,您可以将每个待办事项的 ID - (todo.id) 传递给点击功能。这现在可以用来识别被点击的特定待办事项(记住每个待办事项的 ID 都是唯一的)
希望这能解决问题。
您最好使用 ng-change
而不是 ng-click
。它的优点是函数将在更改发生后调用,而不是可能之前。
但是代码没有错并且确实有效,正如您在附加代码段中看到的那样(如果将 ng-change
替换为 ng-click
)仍然有效。所以你可能想更好地描述你的问题。
PS:作为旁注,您对 label
的使用是错误的,因为它没有连接到输入。相反,将 <label>
打开标记放在输入之前(或使用 for="inputId"
属性),这使您能够单击标签而不仅仅是复选框(并且有利于可访问性)
angular.module("test", []).controller("test", function($scope) {
$scope.todos = [
{title: 'todo #1', completed: false},
{title: 'todo #2', completed: false},
{title: 'todo #3', completed: false}
];
$scope.checkAndSave = function(todo) {
status = todo.completed ? 'checked' : 'unchecked';
alert(todo.title + ' has been ' + status);
}
});
li { list-style-type: none; margin: 5px; padding: 5px; background: #eee; font-family: monospace; width: 8em; border-radius: 6px; }
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="test" ng-controller="test">
<li ng-repeat="todo in todos track by $index">
<div class="view">
<label>
<input
class="toggle"
type="checkbox"
ng-model="todo.completed"
ng-change="checkAndSave(todo)">
{{todo.title}}</label>
</div>
</li>
</div>