J'ai fait beaucoup de knockoutjs récemment, et je suis tombé sur une étrange occurrence.
Comme vous pouvez le voir dans ce violon http://jsfiddle.net/hqXjv/ lorsque vous configurez une liaison à click: testMethod
, L'action se déclenche lorsque vous cliquez sur le bouton.
Comme vous pouvez le voir dans ce violon http://jsfiddle.net/kxTzM/ lorsque vous configurez la liaison à click: testMethod('hi')
l'action se déclenche à la fois lorsque le bouton est cliqué et lors du chargement de la page (Je devine sur applyBindings)
Avoir un paramètre n'est pas nécessaire pour reproduire le problème, si vous changez la liaison en click: testMethod()
dans le premier violon, vous voyez qu'il est déclenché au chargement de la page.
Alors que, oui, je pourrais ajouter un autre attribut à l'élément et tenter de l'utiliser comme paramètre, ma question est, existe-t-il un moyen de passer des paramètres aux liaisons knockoutjs sans les déclencher en charge. Si c'est un bug, tant pis, mais je veux juste savoir comment l'éviter.
Je pense que "Note 2" sur cette page à élimination directe explique tout:
http://knockoutjs.com/documentation/click-binding.html
Vous pouvez éviter le problème en utilisant:
Fonctions anonymes:
<button data-bind="click: function(data, event) { myFunction(data, event, 'param1', 'param2') }">Click me</button>
... ou ...
La méthode de liaison:
<button data-bind="click: myFunction.bind($data, 'param1', 'param2')">Click me</button>
Ce qui suit a exécuté la fonction de clic lors du chargement
click: clickSpan()
en supprimant les crochets comme ci-dessous, la fonction n'a pas été exécutée onload
click: clickSpan
(cela est expliqué dans la note 2 ci-dessus mais c'était sous forme cryptique :-)
Je suis tombé sur cela dans les circonstances suivantes:
Pour cette raison, je crois que ce qui s'est passé était que j'avais un mauvais TypeScript qui ne compilerait pas, seulement je n'ai reçu aucun avertissement ou erreur à cet effet, et les modifications que j'ai apportées à mon TypeScript n'étaient pas reflétées correctement dans l'auto. fichiers JavaScript générés.
Il peut être rare que d'autres voient cela, mais je suppose qu'un mot d'avertissement est que vous pourriez rencontrer cela ou tout autre comportement inattendu si vous modifiez TypeScript en place lors de l'exécution du débogueur VS. Je soupçonne que j'avais créé la situation décrite par Mark Robinson dans mes fichiers js générés automatiquement, mais je ne l'ai pas vu dans mon TypeScript.