Comment faire un angularjs multi-étape/assistant de formulaire sur une page/url

j'essaie de trouver des approches raisonnables dans AngularJS pour créer une fonction qui est composée de plusieurs étapes (i.e., un assistant) mais est liée à une page/URL. Les données d'une étape devraient être envoyées à (ou partagées avec) l'étape suivante.

Les principaux points sont les suivants:

  • l'url doit rester la même (i.e., http://mydomain/myapp/nameupdater) pour toutes les étapes et,
  • les données peuvent être envoyées par étapes (i.e., je dois donner les données trouvées à partir de l'étape 1 pour remplir les données dans l'étape 2).

Par exemple supposons que j'ai une fonction qui fait une mise à jour en bloc de noms:

  • À l'étape 1 de la fonction, vous rechercher un nom.
  • à l'étape 2, la fonction présente une liste des noms trouvés à l'étape 1 et permet à l'utilisateur de les modifier.

j'ai commencé une approche où chaque pas avait sa propre vue et son contrôleur. Et, le angular-ui-router maintenu les états de fonction. Mais, je n'ai aucune idée de comment je pourrais partager les données entre les étapes.

est-ce que quelqu'un connaît une bonne approche pour établir des formulaires multi-étapes/magiciens à angularjs?

Plunker code ici de ma très faible tentative à ce sujet.

29
demandé sur whyceewhite 2014-06-15 02:26:03

1 réponses

je pense que la meilleure façon de le faire serait d'utiliser ng-switch, juste un contrôleur, un itinéraire, pas de rechargement, à l'aide de variables partagées dans toutes les étapes, comme ceci:

<div ng-controller="stepCtrl">
   <div ng-switch="step">
      <div ng-switch-when="1">
         <!-- here you can include your step 1 template,
              or simply just hardcode it here: -->
         <div ng-include src="'.../step1.html'">
         <button ng-click="setStep(1)"></button>
      </div>
      <div ng-switch-when="2">

         <div ng-include src="'.../step2.html'">
         <button ng-click="setStep(2)"></button>
      </div>
      <div ng-switch-when="3">
         <div ng-include src="'.../step3.html'">
         <button ng-click="setStep(3)"></button>
      </div>
   </div>
</div>

     yourApp.controller('stepCtrl',function($scope){
        $scope.step = 1;
        $scope.setStep = function(step){
           $scope.step = step;
        }
      });

de Cette façon, vous pouvez également manipuler l'URL pour ajouter une étape à la fin de votre emplacement actuel.

mise à jour:

en fait cette réponse est pour il y a longtemps , ces jours je préfère personnellement utiliser ui-router qui est un grand module que vous pouvez injecter à votre application AngularJs et le rendre encore plus cool avec des vues emboîtées . En parlant de vues imbriquées, voici ma nouvelle approche pour un formulaire multystep avec une certaine animation:

le Premier :

Using $stateProvider declare any steps you want in separate views : 

 app.config(function($stateProvider, $urlRouterProvider) {

$stateProvider

    .state('wizard', {// this will be the wrapper for our wizard
        url: '/wizard',
        templateUrl: 'wizard.html',
        controller: 'wizardController'
    })
    .state('wizard.stepOne', {// this will be the wrapper for our wizard
        url: '/stepOne',
        templateUrl: 'stepOne.html',
        controller: 'wizardController'
    })
    .state('wizard.stepTwo', {// this will be the wrapper for our wizard
        url: '/stepTwo',
        templateUrl: 'stepTwo.html',
        controller: 'wizardController'
    })

Puis plus tard dans notre "de l'assistant.html" nous pouvons avoir quelque chose comme ceci :

    <div id="container">

    <div>
        <h2>Our multistep form wizard</h2>


        <div id="status-buttons" class="text-center">
            <a ui-sref-active="active" ui-sref=".stepOne"><span>1</span> Step One</a>
            <a ui-sref-active="active" ui-sref=".stepTwo"><span>2</span> Step Two </a>

        </div>
    </div>
   <!-- Here we specify our view that is a container for our subviews(steps) , which in our case can be a form !-->

    <form id="signup-form" ng-submit="submit()">
        <!-- nested state views will be inserted here -->
        <div  ui-view></div>
    </form>

</div>

et évidemment pour nos pas, nous devons avoir des fichiers html séparés. De cette façon , nous avons toujours un controller , url sera mis à jour , et on peut aussi ajouter l'animation angulaire .

51
répondu Milad 2015-07-14 11:51:43