Nous avons vu que cette technologie a été appliquée à de nombreuses pages Web. Des éléments tels que les paniers d'achat, les formulaires d'inscription, les flux d'intégration et de nombreux formulaires en plusieurs étapes permettent aux utilisateurs de remplir plus facilement des formulaires en ligne.
Ici, nous allons le construire :
En utilisant UI Router, qui peut intégrer des états et afficher différentes vues pour chaque état, nous pouvons créer des formulaires en plusieurs étapes assez facilement.
Pour comprendre rapidement le fonctionnement de UI Router, lisez notre article : AngularJS utilise le routage UI-Router
Passons aux choses sérieuses et commençons à créer notre meilleur formulaire à ce jour !
Créer un projet
La création d'un projet a une structure de modèle. Elle nécessite un fichier de mise en page, un fichier de vue pour chaque formulaire, un fichier de format et un fichier JavaScript.
Voici la liste des fichiers, créez-les d'abord, puis remplissez le contenu
- index.html - form.html - form-profile.html - form-interests.html - form-payment.html - app.js - style.css
Chaque form-____.html représente un fichier html dans une structure hiérarchique. Ces structures créent finalement notre structure de formulaire.
Notre fichier de mise en page/modèle index.html
Nous commençons notre projet en créant un fichier principal pour introduire toutes les ressources dont nous avons besoin Ici, nous utilisons le fichier index.html comme fichier principal
.
Maintenant, nous chargeons les ressources dont nous avons besoin (AngularJS, ngAnimate, Ui Router et autres scripts et feuilles de style) et configurons une vue UI pour indiquer au routeur UI où notre vue doit être affichée. Ici, nous utilisons Bootstrap pour appliquer rapidement des styles.
<!-- index.html --> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <!-- CSS --> <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootswatch/3.1.1/darkly/bootstrap.min.css"> <link rel="stylesheet" href="style.css"> <!-- JS --> <!-- load angular, nganimate, and ui-router --> <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.10/angular-ui-router.min.js"></script> <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular-animate.min.js"></script> <script src="app.js"></script> </head> <!-- apply our angular app --> <body ng-app="formApp"> <div class="container"> <!-- views will be injected here --> <div ui-view></div> </div> </body> </html>
Après avoir terminé l'introduction de tous les fichiers, entrons dans app.js pour commencer à créer l'application Angular et la configuration de routage la plus basique. Remarquez comment nous avons appliqué l'application angulaire (formApp) au corps.
Créez notre application angulaire app.js
Créons maintenant l'application et les itinéraires. Dans une grande application, vous voudriez certainement distribuer vos applications, routes et contrôleurs Angular dans leurs propres modules, mais pour notre cas d'utilisation simple, nous les placerons tous dans l'heureuse famille du milieu app.js.
Nous avons maintenant une application dans laquelle ngAnimate et ui.router sont injectés. Nous avons également établi des itinéraires correspondants. Remarquez comment nous définissons l'URL, le fichier de vue (templateUrl) et le contrôleur pour chaque zone de vue.
Le formulaire sera notre zone de visualisation principale. Il dispose également d'une zone de sous-vue form.profile séparée par . Cette idée peut être réalisée lorsque l'état de l'application change (Traducteur : il peut s'agir de routage, de queryString, etc.), la sous-vue sera affichée dans la zone de vue principale. (Traducteur : et il peut uniquement mettre à jour les modifications de la zone de sous-vue et enregistrer l'état de la zone de sous-vue).
Nous le démontrerons dans la section suivante. Nous devons maintenant créer des vues pour le formulaire et ses zones de sous-vues.
Commençons par créer un nouveau form.html. Ce fichier servira de modèle pour le reste de nos fichiers de vue de formulaire, tout comme index.html est utilisé comme modèle global pour l'ensemble du projet. Tout ce que nous avons à faire est d'inclure ui-view dans ce fichier pour que les déclarations imbriquées sachent où injecter leurs vues.
<!-- form.html --> <div class="row"> <div class="col-sm-8 col-sm-offset-2"> <div id="form-container"> <div class="page-header text-center"> <h2>Let's Be Friends</h2> <!-- the links to our nested states using relative paths --> <!-- add the active class if the state matches our ui-sref --> <div id="status-buttons" class="text-center"> <a ui-sref-active="active" ui-sref=".profile"><span>1</span> Profile</a> <a ui-sref-active="active" ui-sref=".interests"><span>2</span> Interests</a> <a ui-sref-active="active" ui-sref=".payment"><span>3</span> Payment</a> </div> </div> <!-- use ng-submit to catch the form submission and use our Angular function --> <form id="signup-form" ng-submit="processForm()"> <!-- our nested state views will be injected here --> <div id="form-views" ui-view></div> </form> </div> <!-- show our formData as it is being typed --> <pre class="brush:php;toolbar:false"> {{ formData }}
Remarquez comment nous utilisons ui-view pour la deuxième fois dans le projet. C’est l’avantage de UI Router : nous pouvons imbriquer des déclarations et des vues. Cela nous donne beaucoup de flexibilité lors du développement d’applications. Pour le contenu de la vue UI Router, veuillez consulter la documentation officielle.
Ajouter une classe d'activation basée sur l'état
Nous voulons que chaque bouton d'état soit affiché lorsqu'il est activé. Afin d'obtenir cet effet, nous utiliserons ui-sref-active fourni par UI Router. Si ui-sref est cohérent avec l'état actuel, la classe que nous spécifions sera ajoutée.
Pour ajouter une validation à vos propres formulaires, consultez Validation de formulaire AngularJS.
Maintenant, vous vous demandez peut-être à quoi ressemble réellement notre formulaire. Ouvrons un navigateur et jetons un œil.
Jusqu’à présent, nous n’obtenons pas tout exactement comme nous l’espérions, mais c’est le début d’une série de belles choses. Allons-y et ajoutons un peu de style, et plus tard nous ajouterons des vues et des commentaires intégrés.
Stylestyle de base.css
Nous allons concevoir notre conteneur de formulaire et nos boutons d'état pour améliorer l'apparence de notre formulaire.
/* style.css */ /* BASIC STYLINGS ============================================================================= */ body { padding-top:20px; } /* form styling */ #form-container { background:#2f2f2f; margin-bottom:20px; border-radius:5px; } #form-container .page-header { background:#151515; margin:0; padding:30px; border-top-left-radius:5px; border-top-right-radius:5px; } /* numbered buttons */ #status-buttons { } #status-buttons a { color:#FFF; display:inline-block; font-size:12px; margin-right:10px; text-align:center; text-transform:uppercase; } #status-buttons a:hover { text-decoration:none; } /* we will style the span as the circled number */ #status-buttons span { background:#080808; display:block; height:30px; margin:0 auto 10px; padding-top:5px; width:30px; border-radius:50%; } /* active buttons turn light green-blue*/ #status-buttons a.active span { background:#00BC8C; }
现在我们的按钮更好看了并且更符合我们想要的了,接下来我们看下嵌套视图。
嵌套视图form-profile.html, form-interests.html, form-payment.html
这部分会比较简单。我们将定义不同的带有我们需要的输入框的视图。并且将他们绑定到formData对象以便我们能看到输入的数据。
下面是我们用于嵌套视图的视图文件:
表单概要视图
<!-- form-profile.html --> <div class="form-group"> <label for="name">Name</label> <input type="text" class="form-control" name="name" ng-model="formData.name"> </div> <div class="form-group"> <label for="email">Email</label> <input type="text" class="form-control" name="email" ng-model="formData.email"> </div> <div class="form-group row"> <div class="col-xs-6 col-xs-offset-3"> <a ui-sref="form.interests" class="btn btn-block btn-info"> Next Section <span class="glyphicon glyphicon-circle-arrow-right"></span> </a> </div> </div>
表单兴趣视图
<!-- form-interests.html --> <label>What's Your Console of Choice?</label> <div class="form-group"> <div class="radio"> <label> <input type="radio" ng-model="formData.type" value="xbox" checked> I like XBOX </label> </div> <div class="radio"> <label> <input type="radio" ng-model="formData.type" value="ps"> I like PS4 </label> </div> </div> <div class="form-group row"> <div class="col-xs-6 col-xs-offset-3"> <a ui-sref="form.payment" class="btn btn-block btn-info"> Next Section <span class="glyphicon glyphicon-circle-arrow-right"></span> </a> </div> </div>
表单支付视图
<!-- form-payment.html --> <div class="text-center"> <span class="glyphicon glyphicon-heart"></span> <h3>Thanks For Your Money!</h3> <button type="submit" class="btn btn-danger">Submit</button> </div>
既然我们已经定义了这些视图,那么当我们浏览表单时,他们就会显示出来。同样我们用下一个按钮和ui-sref来连接每一个新视图.
当使用ui-sref时,你要连接到你路由中定义的state而不是URL。然后Angular会使用这个来为你构建href。
下面是我们表单目前的每一个页面。
为了让我们的页面不同寻常,让我们加上动画效果。
让我们的表单产生动画效果
因为在项目开始的时候,我们已经加载了ngAnimate,它已经添加到需要动画的的类上了。当视图进入或退出的时候,它将自动添加类ng-enter和ng-leave。
现在我们所有做的就是通过样式形成我们最终的表单。为了理解Angular动画,这篇文章是一个很好的起点。
让我们进去css文件,将动画,并应用到我们的表单上
/* style.css */ /* ANIMATION STYLINGS ============================================================================= */ #signup-form { position:relative; min-height:300px; overflow:hidden; padding:30px; } #form-views { width:auto; } /* basic styling for entering and leaving */ /* left and right added to ensure full width */ #form-views.ng-enter, #form-views.ng-leave { position:absolute; left:30px; right:30px; transition:0.5s all ease; -moz-transition:0.5s all ease; -webkit-transition:0.5s all ease; } /* enter animation */ #form-views.ng-enter { -webkit-animation:slideInRight 0.5s both ease; -moz-animation:slideInRight 0.5s both ease; animation:slideInRight 0.5s both ease; } /* leave animation */ #form-views.ng-leave { -webkit-animation:slideOutLeft 0.5s both ease; -moz-animation:slideOutLeft 0.5s both ease; animation:slideOutLeft 0.5s both ease; } /* ANIMATIONS ============================================================================= */ /* slide out to the left */ @keyframes slideOutLeft { to { transform: translateX(-200%); } } @-moz-keyframes slideOutLeft { to { -moz-transform: translateX(-200%); } } @-webkit-keyframes slideOutLeft { to { -webkit-transform: translateX(-200%); } } /* slide in from the right */ @keyframes slideInRight { from { transform:translateX(200%); } to { transform: translateX(0); } } @-moz-keyframes slideInRight { from { -moz-transform:translateX(200%); } to { -moz-transform: translateX(0); } } @-webkit-keyframes slideInRight { from { -webkit-transform:translateX(200%); } to { -webkit-transform: translateX(0); } }
首先,确定视图离开或进去时,表单的样式,他们是绝对定位的。需要确认当视图进入的时候一个视图不会放到另一个视图的下面。
其次,应用我们的动画到.ng-enter和.ng-leave类
第三,用@keyframes定义动画。所有这些部分组合到一起,我们的表单就有了Angular动画,基于状态的UI Router和Angular数据绑定。
以上所述是小编给大家分享的AngularJS 使用 UI Router 实现表单向导的相关知识,希望对大家有所帮助。