En cliquant sur une case à cocher et en appelant ng-click: le modèle n'est pas mis à jour avant que ng-click ne démarre, donc la valeur de la case à cocher est mal présentée dans l'interface utilisateur:
Cela fonctionne dans AngularJS 1.0.7 et semble cassé dans 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}}
et contrôleur:
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;
};
}]);
Violon cassé avec Angular 1.2 RCx - http://jsfiddle.net/supercobra/ekD3r/
Fidddle de travail avec Angular 1.0.0 - http://jsfiddle.net/supercobra/8FQNw/
Réponses:
Que diriez-vous de changer
<input type='checkbox' ng-click='onCompleteTodo(todo)' ng-model="todo.done">
à
<input type='checkbox' ng-change='onCompleteTodo(todo)' ng-model="todo.done">
À partir de la documentation :
la source
Comme indiqué dans https://github.com/angular/angular.js/issues/4765 , le passage de ng-click à ng-change semble résoudre ce problème (j'utilise Angular 1.2.14)
la source
L'ordre dans lequel
ng-click
etng-model
sera exécuté est ambigu (puisque ni l'un ni l'autre ne les définissent explicitementpriority
). La solution la plus stable à cela serait d'éviter de les utiliser sur le même élément.En outre, vous ne voulez probablement pas du comportement que les exemples montrent; vous voulez que le
checkbox
réponde aux clics sur le texte complet de l' étiquette , pas seulement sur la case à cocher. Par conséquent, la solution la plus propre serait d'envelopper leinput
(avecng-model
) dans unlabel
(avecng-click
):<label ng-click="onCompleteTodo(todo)"> <input type='checkbox' ng-model="todo.done"> {{todo.text}} </label>
Exemple de travail: http://jsfiddle.net/b3NLH/1/
la source
Pourquoi n'utilisez-vous pas
$watch('todo',function(.....
Ou une autre solution serait de définir l'
todo.done
intérieur du rappel ng-click et d'utiliser uniquement 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}}
et
$scope.onCompleteTodo = function(todo) { todo.done = !todo.done; //toggle value console.log("onCompleteTodo -done: " + todo.done + " : " + todo.text); $scope.current = todo; }
la source
Remplacer ng-model par ng-checked fonctionne pour moi.
la source
C'est une sorte de hack mais l'envelopper dans un délai d'attente semble accomplir ce que vous recherchez:
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; }); }; }]);
la source
L'ordre entre
ng-model
etng-click
semble être différent et c'est quelque chose sur lequel vous ne devriez probablement pas vous fier. Au lieu de cela, vous pouvez faire quelque chose comme ceci:<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>
Et votre script:
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; }; }]);
Ce qui est différent ici, c'est que chaque fois que vous cliquez sur une case, cela définit cette case comme ce qui est "actuel" et affiche ensuite ces valeurs dans la vue. http://jsfiddle.net/QeR7y/
la source
Solution de: https://groups.google.com/forum/#!topic/angular/7Nd_me5YrHU
la source
#t=5m08s
dans votre lien YouTube afin qu'il ne soit pas nécessaire de regarder la vidéo complète. Voir mattcutts.com/blog/link-to-youtube-minute-secondJe viens de remplacer
ng-model
avecng-checked
et cela a fonctionné pour moi.Ce problème s'est produit lorsque j'ai mis à jour ma version angulaire de
1.2.28
à1.4.9
Vérifiez également si votre
ng-change
problème est ici. Je devais aussi supprimer monng-change
pour le faire fonctionner.la source
.task{ng:{repeat:'task in model.tasks'}} %input{type:'checkbox',ng:{model:'$parent.model.tasks[$index].enabled'}}
la source