web-dev-qa-db-fra.com

knockoutjs - liaisons avec paramètres déclenchés lors de la charge

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.

61
deltree

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>
94
Mark Robinson

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 :-)

22
orangesherbert

Je suis tombé sur cela dans les circonstances suivantes:

  • J'exécutais Visual Studio 2013.
  • Mon projet KO utilisait TypeScript 1.5.
  • J'exécutais mon projet dans chrome à l'aide du débogueur Visual Studio.
  • J'avais mal refactorisé du code et négligé de recompiler ou de réexécuter le débogueur.

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.

3
ergu