Knock-out case événement de changement envoie l'ancienne valeur
Je vais avoir un problème avec knock-out "checked" de liaison. Il semble que l'événement "change" à la case de retour de l'ancienne valeur, avant qu'il soit mis à jour(si elle a été désactivée, elle renvoie false). Je ne pense pas que je peux vous abonner à la valeur puisque je l'ai à l'intérieur de l'objet.
<tbody data-bind="foreach: Categories">
<tr>
<td><input type="checkbox" data-bind="checked: ShowOpened, event: { change: $root.CategoryChange }" /></td>
</tr>
</tbody>
<script type="text/javascript">
var Category = function (Id, Name, Order, ShowOpened) {
this.Id = Id;
this.Name = Name;
this.Order = Order;
this.ShowOpened = ShowOpened;
this.IsUpdated = ko.observable(false);
this.OldOrder = Order;
this.OldShowOpened = ShowOpened;
};
var ViewModel = {
Categories: ko.observableArray([]),
CategoryChange: function(pCategory) {
if(pCategory.Order != pCategory.OldOrder || pCategory.ShowOpened != pCategory.OldShowOpened)
pCategory.IsUpdated(true);
else
pCategory.IsUpdated(false);
}
};
ko.applyBindings(ViewModel);
</script>
Donc dans cet exemple j'ai ShowOpened case qui peuvent déclencher CategoryChange méthode qui va changer une variable à l'intérieur de l'objet(que j'ai besoin plus tard pour savoir quels objets sont mis à jour). Mais quand le chechbox est changé, toujours envoyer l'ancienne valeur, méthode de déclenchement, puis les changements de la valeur. Est-il possible de résoudre ce problème?
- Quelque chose ne va pas avec votre code. Ni
ShowOpened
niIsUpdated
sont ko.observables (et probablement c'est pourquoi vous obtenez toujours l'ancienne valeur). Comment ce code fonctionne même?CategoryChange
doit lever une exception. - vous êtes wright, j'ai fait une erreur lors de la création de ce post à l'origine. Mais toujours l'erreur vous avez indiqué n'est pas le problème.
- Oi, manquant encore ceci:
this.ShowOpened = ko.observable(ShowOpened);
et ce:pCategory.ShowOpened()
. Je dois dire que vous avez fait beaucoup d'erreurs lors de l'écriture de ce post...
Vous devez vous connecter pour publier un commentaire.
Depuis que vous avez persisté sur le constat que le manque de
ko.observables
n'est pas un problème, j'ai regardé de plus près. Il me semble que vous avez raison! Lechange
événement est déclenché avant la valeur réelle est définie. Je crains que je ne sais pas la raison pour cela.Mais il y a un moyen facile de résoudre ce problème: il suffit de changer
change
événement àclick
événement:N'oubliez pas que vous devez explicitement mis
return true;
à la fin declick
gestionnaire d'événement. Sinon, la nouvelle valeur ne sera pas définie à une case à cocher.Si vous ne souhaitez pas utiliser
click
cas, alors vous pouvez le faire dans l'autre sens. Abonnez-vous à des changements deShowOpened
:change
événement. Grr.Essayez d'utiliser
subscribe
au lieu de liaison d'événements. Cela devrait fonctionner maintenantOu comme alternative (et à mon avis une meilleure solution), vous pouvez utiliser
dependentObservable
, maintenant appelécomputed
. Voici comment il devrait ressembler àJ'ai aussi eu ce problème, mais je ne pouvais pas utiliser le abonnez-vous une solution parce que j'étais déjà abonnée à la même champ avec une requête ajax qui pourrait réinitialiser la valeur. Le code serait rester dans une boucle lorsque vous l'avez modifiée. J'ai donc ajouté la solution de contournement suivante (sa moche mais ça fonctionne).
Alors, plutôt que sur l'écoute, le changement que je voudrais écouter l'afterChange événement.
Je sais que c'est pas la meilleure solution, mais dans mon cas, je n'avais pas d'autre option.