7
votes

L'applybindings () est trop rapide, appelée avant la fin de Ajax

Veuillez considérer l'extrait de vue de la vue suivant: xxx

Il semble que mon appel Ajax à travers $. Obtenir est trop lent ou le ko.ApplyBindings ( ) est trop rapide. De toute façon, il semble que Knockout ne puisse bien se lier que si je ne justifie pas la ligne alerte ('ici'); .

Si je le laisses commenté, aucun des contrôles ne sont renseignés .

Des idées, des personnes?

Le seul travail autour de je pouvais penser est de faire .ApplyBindings dans le cadre du rappel de la fonction dans $ .get comme ceci: xxx


2 commentaires

Les deux réponses sont valables, en fonction de ce que vous essayez d'atteindre.


Il suffit de vouloir revoir cela, je crois que ma première façon de penser était toujours dans le domaine de la programmation synchrone. Le bon est le second - en faisant la liaison d'une partie du processus asynchrone.


3 Réponses :


15
votes

Votre solution de contournement est la bonne façon de faire les choses. Ceci est votre gestionnaire de «suite» qui est appelé lorsque les données sont renvoyées et que c'est le point correct pour remplir ensuite votre modèle de vue et appliquer les fixations.


3 commentaires

Merci Mark, - Je marquais cela comme une réponse pour le moment (je suis relativement nouveau à Knockout).


J'ai eu un problème similaire, même si j'ai eu mes données reliant correctement le modèle, j'ai eu certaines de mes contrôles d'interface utilisateur ne parviennent pas à se lier correctement dans mon modèle. (Le contrôle de l'accordéon fonctionnait, mais la date d'accompagnement de l'accordéon n'est pas) la solution consistait à déplacer le code qui fixe mes pickers, etc. dans une fonction appelée après mon "succès". Quelque chose d'autre pour garder un œil sur. +1 Mark, votre réponse m'a pointé dans la bonne direction.


C'est la bonne réponse - mais je pensais ajouter pourquoi ... - L'appel $ .AJAX est asynchrone, il va donc directement à la ligne suivante - les liaisons applicables. En le mettant dans le rappel, il est appelé après le processus asynchrone complète. La meilleure façon de le faire serait de le mettre dans le gestionnaire .Success () de sorte que cela ne le fait que s'il se termine avec succès.



8
votes

Cette solution de contournement ne fonctionnera que tant que vous n'avez qu'un seul appel AJAX sur la page. Je pense que la bonne solution consiste à créer d'abord votre viewModel, avec ID, donné1 et donnée2 étant observables (initialement vide). Et puis dans le rappel Ajax, vous modifiez la valeur de ces observables.


0 commentaires

0
votes

Le moyen plus vrai est exécuté votre appel AJAX à l'intérieur de l'objet ViewModel et peupler ses propriétés.


0 commentaires