J'ai une situation avec un formulaire qui s'étend sur plusieurs pages (ce n'est peut-être pas idéal, mais c'est comme ça). J'aimerais avoir une portée pour l'ensemble du formulaire qui se remplit au fur et à mesure, de sorte que si l'utilisateur fait des va-et-vient entre les étapes, il est facile de se souvenir de l'état.
Je dois donc faire, en très pseudo-code:
- Ensemble
$scope.val = <Some dynamic data>
- Cliquez sur un lien et être dirigé vers un nouveau modèle (probablement avec le même contrôleur).
$scope.val
devrait toujours avoir la même valeur que sur la dernière page.
Les données persistantes pour la portée sont-elles en quelque sorte la bonne façon de procéder, ou y a-t-il une autre façon? Pouvez-vous même créer un contrôleur qui a une portée persistante entre les routes, sauf pour l'enregistrer dans une base de données bien sûr.
scope
routes
angularjs
controllers
Erik Honn
la source
la source
Réponses:
Vous devez utiliser un service car un service persistera tout au long de la vie de votre application.
Disons que vous souhaitez enregistrer les données relatives à un utilisateur
Voici comment vous définissez le service:
Dans votre premier contrôleur:
la source
Value Recipe
docs.angularjs.org/guide/providers , commemyApp.value('clientId', 'a12345654321x');
est-ce également persistant entre les routes?Le service fonctionnera, mais une manière logique de le faire en utilisant uniquement des portées et des contrôleurs ordinaires consiste à configurer vos contrôleurs et éléments de manière à ce qu'ils reflètent la structure de votre modèle. En particulier, vous avez besoin d'un élément parent et d'un contrôleur qui établissent une portée parent. Les pages individuelles du formulaire doivent résider dans une vue qui est un enfant du parent. L'étendue parent persiste même lorsque la vue enfant est mise à jour.
Je suppose que vous utilisez ui-router afin que vous puissiez avoir des vues nommées imbriquées. Puis en pseudo-code:
Ensuite, WizardController définit les variables de portée que vous souhaitez conserver à travers les étapes du formulaire multi-pages (que je qualifie d '«assistant»). Ensuite, vos itinéraires seront mis à jour
stepView
uniquement. Chaque étape peut avoir ses propres modèles, contrôleurs et étendues, mais leurs étendues sont perdues de page en page. Mais les étendues de WizardController sont conservées sur toutes les pages.Pour mettre à jour les étendues WizardController à partir des contrôleurs enfants, vous devez utiliser une syntaxe similaire à celle-ci
$scope.$parent.myProp = 'value'
ou définir une fonctionsetMyProp
sur WizardController pour chaque variable d'étendue. Sinon, si vous essayez de définir les variables de portée parent directement à partir des contrôleurs enfants, vous finirez par créer simplement une nouvelle variable de portée sur l'enfant lui-même, en ombrant la variable parente.Un peu difficile à expliquer et je m'excuse pour le manque d'exemple complet. Fondamentalement, vous voulez un contrôleur parent qui établit une portée parent, qui sera préservée sur toutes les pages de votre formulaire.
la source
$scope.$parent.myProp = 'hello world';
Les données peuvent être transmises entre les contrôleurs de deux manières
$rootScope
L'exemple ci-dessous montre le passage de valeurs à l'aide du modèle
app.js
SharedService.js
// Modifier la valeur dans le contrôleur A
Controller.js
// Accéder à la valeur dans controllertwo
ControllerTwo.js
J'espère que cela t'aides.
la source