Щелчок по флажку и вызов ng-click: модель не обновляется до срабатывания ng-click, поэтому значение флажка неверно отображается в пользовательском интерфейсе:
Это работает в AngularJS 1.0.7 и кажется неработающим в Angualar 1.2-RCx.
<div ng-app="myApp" ng-controller="Ctrl">
<li ng-repeat="todo in todos">
<input type='checkbox' ng-click='onCompleteTodo(todo)' ng-model="todo.done">
{{todo.text}}
</li>
<hr>
task: {{todoText}}
<hr><h2>Wrong value</h2>
done: {{doneAfterClick}}
и контроллер:
angular.module('myApp', [])
.controller('Ctrl', ['$scope', function($scope) {
$scope.todos=[
{'text': "get milk",
'done': true
},
{'text': "get milk2",
'done': false
}
];
$scope.onCompleteTodo = function(todo) {
console.log("onCompleteTodo -done: " + todo.done + " : " + todo.text);
$scope.doneAfterClick=todo.done;
$scope.todoText = todo.text;
};
}]);
Сломанный скрипт с Angular 1.2 RCx - http://jsfiddle.net/supercobra/ekD3r/
Рабочий скрипт с Angular 1.0.0 - http://jsfiddle.net/supercobra/8FQNw/
Ответы:
Как насчет изменения
<input type='checkbox' ng-click='onCompleteTodo(todo)' ng-model="todo.done">
к
<input type='checkbox' ng-change='onCompleteTodo(todo)' ng-model="todo.done">
Из документов :
источник
Как сообщается в https://github.com/angular/angular.js/issues/4765 , переключение с ng-click на ng-change, похоже, исправляет это (я использую Angular 1.2.14)
источник
Порядок , в котором
ng-click
иng-model
будет выполняться неоднозначно (так как ни явно не установить ихpriority
). Наиболее стабильным решением этой проблемы было бы избегать их использования в одном элементе.Кроме того, вам, вероятно, не нужно поведение, которое показывают примеры; вы хотите,
checkbox
чтобы он реагировал на щелчки по всему тексту метки , а не только по флажку. Следовательно, самым чистым решением было бы обернутьinput
(withng-model
) внутриlabel
(withng-click
):<label ng-click="onCompleteTodo(todo)"> <input type='checkbox' ng-model="todo.done"> {{todo.text}} </label>
Рабочий пример: http://jsfiddle.net/b3NLH/1/
источник
Почему ты не используешь
$watch('todo',function(.....
Или другим решением было бы установить
todo.done
внутренний обратный вызов ng-click и использовать только ng-click<div ng-app="myApp" ng-controller="Ctrl"> <li ng-repeat="todo in todos"> <input type='checkbox' ng-click='onCompleteTodo(todo)'> {{todo.text}} {{todo.done}}
а также
$scope.onCompleteTodo = function(todo) { todo.done = !todo.done; //toggle value console.log("onCompleteTodo -done: " + todo.done + " : " + todo.text); $scope.current = todo; }
источник
У меня работает замена ng-model на ng-checked.
источник
Это своего рода хакерский прием, но, заключив его в тайм-аут, кажется, можно добиться того, что вы ищете:
angular.module('myApp', []) .controller('Ctrl', ['$scope', '$timeout', function ($scope, $timeout) { $scope.todos = [{ 'text': "get milk", 'done': true }, { 'text': "get milk2", 'done': false }]; $scope.onCompleteTodo = function (todo) { $timeout(function(){ console.log("onCompleteTodo -done: " + todo.done + " : " + todo.text); $scope.doneAfterClick = todo.done; $scope.todoText = todo.text; }); }; }]);
источник
Порядок между
ng-model
иng-click
кажется другим, и на это вам, вероятно, не стоит полагаться. Вместо этого вы можете сделать что-то вроде этого:<div ng-app="myApp" ng-controller="Ctrl"> <li ng-repeat="todo in todos"> <input type='checkbox' ng-model="todo.done" ng-click='onCompleteTodo(todo)'> {{todo.text}} {{todo.done}} </li> <hr> task: {{current.text}} <hr> <h2>Wrong value</h2> done: {{current.done}} </div>
И ваш сценарий:
angular.module('myApp', []) .controller('Ctrl', ['$scope', function($scope) { $scope.todos=[ {'text': "get milk", 'done': true }, {'text': "get milk2", 'done': false } ]; $scope.current = $scope.todos[0]; $scope.onCompleteTodo = function(todo) { console.log("onCompleteTodo -done: " + todo.done + " : " + todo.text); //$scope.doneAfterClick=todo.done; //$scope.todoText = todo.text; $scope.current = todo; }; }]);
Здесь разница в том, что всякий раз, когда вы щелкаете по полю, он устанавливает это поле как «текущее», а затем отображает эти значения в представлении. http://jsfiddle.net/QeR7y/
источник
Решение от: https://groups.google.com/forum/#!topic/angular/7Nd_me5YrHU
источник
#t=5m08s
в своей ссылке на YouTube, чтобы не было необходимости смотреть полное видео. См. Mattcutts.com/blog/link-to-youtube-minute-secondЯ просто заменил
ng-model
на,ng-checked
и у меня это сработало.Эта проблема возникла, когда я обновил свою угловую версию с
1.2.28
на1.4.9
Также проверьте,
ng-change
не вызываете ли вы здесь какие-либо проблемы. Мне пришлось снять и мой,ng-change
чтобы он заработал.источник
.task{ng:{repeat:'task in model.tasks'}} %input{type:'checkbox',ng:{model:'$parent.model.tasks[$index].enabled'}}
источник