Durandal: meilleure façon de passer des données entre viewmodels
-
21-12-2019 - |
Question
Durandalal: quelle est la bonne façon de passer des données (paramètres) entre les images de vue si possible (sans traiter le backend).
Disons que j'ai 2 vues Vue d'ensemble et Détails Je veux que l'utilisateur klick sur un élément de liste de aperçu il prend l'identifiantde cet élément et transmettez-le à
Merci pour l'aide
La solution
Astuce: vous voulez probablement l'approche axée sur la route. L'autre est pour des raisons d'exhaustivité.
Approche axée sur route Semble être ce que vous voudriez faire de votre description de la situation. Les itinéraires définis peuvent prendre (facultatif) paramètres. Supposons que vous ayez maintenant une route 'Détails', vous pouvez le modifier vers 'Détails /: ID' (Accepte un paramètre d'identifiant, non-facultatif) ou 'Détails (/: ID)' (Accepte un paramètre d'identification, facultatif).
Vous avez besoin d'un gestionnaire d'événements un peu comme celui-ci pour cliquer sur un élément de liste:
overview.onElementClick = function (e) {
var element = this, // The idea is that you need the clicked element for the next line of code
koDataForElement = ko.dataFor(element);
router.navigate('details/' + koDataForElement.id);
}
ko.datafor est une bonne aide de Knockout pour obtenir les données de la viewModel qui est liée à l'élément que vous transmettez, dans ce cas votre élément de liste. En cliquant sur CLICK, vous souhaitez naviguer vers les détails et transmettre l'identifiant de l'élément cliqué sur les détails. Que le code ci-dessus fait tout cela.
MAINTENANT VOS DÉTAILS La fonction Activate de la viewModel doit ressembler à ceci:
details.activate = function (id) {
// id is the parameter we defined for the route. Now you are free to leverage it inside your second view!
};
Edit: Indice supplémentaire: vous pouvez également déclencher l'itinéraire avec ID directement à partir d'un lien. Supposons que votre élément de liste est enveloppé dans une balise d'ancrage, vous pouvez faire quelque chose comme ceci:
<div data-bind="foreach: myListOfElements">
<a href="#" data-bind="attr: { href: '#details/' + id }">listElementGoesHere</a>
</div>
bonne chance! Si ce n'est toujours pas clair, laissez-moi savoir,