Этот урок связан с проектом Создание приложения на AngularJS и Firebase

Создание приложения на AngularJS и Firebase: Часть 2

В первой части данной серии мы начали с того, что создали простое приложение на AngularJS и Firebase. Нами была создана страничка входа и реализован механизм аутентификации через Firebase.

Сегодня мы пойдём ещё дальше: создадим страницу регистрации и посмотрим как осуществить валидацию форм в AngularJS.

Стартуем

Давайте начнём с создания копии кода из предыдущего урока.

git clone https://github.com/jay3dec/AngularJS_Firebase_Part1.git

После того, как код скачан, не забудьте переключиться на папку проекта и установить нужные зависимости.

cd AngularJS_Firebase_Part1
npm install

После установки всех зависимостей запускаем сервер.

npm start

Отправившись по адресу http://localhost:8000/app/#/home вы должны увидеть запущенное приложение.

Создание странички регистрации

Начнём с создания страницы для регистрации новых пользователей.

Начнём с создания страницы для регистрации новых пользователей. Отправляемся в AngularJS_Firebase_Part1/app и создаём папку под названием register. Внутри папки register создаём файлы register.html и register.js. Вот и содержимое файла register.html:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link rel="icon" href="http://getbootstrap.com/favicon.ico">

    <title>AngularJS & Firebase Web App</title>

    <link href="http://getbootstrap.com/dist/css/bootstrap.min.css" rel="stylesheet">
    <link href="http://getbootstrap.com/examples/signin/signin.css" rel="stylesheet">

    <link href="justified-nav.css" rel="stylesheet">

</head>

<body>

    <div class="container">
        <div class="jumbotron" style="padding-bottom:0px;">
            <h2>AngularJS & Firebase App!</h2>
        </div>
        <form class="form-signin" role="form">
            <input type="email" class="form-control" placeholder="Email address" required="" autofocus="">
            <input type="password" class="form-control" placeholder="Password" required="">
            <label class="checkbox">
                <a href="#"> Sign In</>
        </label>
        <button type="button" class="btn btn-lg btn-primary btn-block">Register</button>
      </form>

    </div>

</body></html>

Как видно из примера, мы используем Bootstrap.

В register.js мы определим маршруты для доступа к представлению с формой регистрации. У объекта $routeProvider есть метод when, с помощью которого можно создать новый маршрут. В качестве параметров необходимо передать templateUrl, который будет задействован в index.html. В то же время мы определим контроллер controller для новой области видимости $scope представления регистрации. В контроллере будет располагаться логика, которая управляет представлением. Содержимое:

'use strict';

angular.module('myApp.register', ['ngRoute'])

// Declared route
.config(['$routeProvider', function($routeProvider) {
    $routeProvider.when('/register', {
        templateUrl: 'register/register.html',
        controller: 'RegisterCtrl'
    });
}])

// Register controller
.controller('RegisterCtrl', [function() {

}]);

Теперь открываем app.js и включаем новый модуль myApp.register.

'use strict';

angular.module('myApp', [
    'ngRoute',
    'myApp.home',
    'myApp.register'  // Newly added register route
]).
config(['$routeProvider', function($routeProvider) {
    // Set defualt view of our app to home

    $routeProvider.otherwise({
        redirectTo: '/home'
    });
}]);

Для отображения страницы регистрации нам необходимо подключить register.js в основном HTML шаблоне приложения. Открываем index.html и добавляем следующее:

<script src="register/register.js"></script>

Перезагружаем сервер и отправляемся по адресу http://localhost:8000/app/index.html#/register. В результате мы должны увидеть следующее:

Теперь давайте создадим ссылку, по которой пользователь сможет открыть страницу регистрации. В home.html и register.html добавляем якоря sign up и sign in соответственно.

В home.html:

<a href="#/register"> Sign Up<a/>

В register.html:

<a href="#/home"> Sign In<a/>

Валидация форм в AngularJS

Теперь нам необходимо организовать проверку данных, введённых пользователем в форму. Во-первых, предоставленный электронный адрес должен быть правильного формата; во-вторых, пароль должен содержать как минимум определённое количество знаков.

В AngularJS есть FormController, который используется при работе с формами.

В FormController есть несколько свойств: $pristine, $dirty, $invalid, $valid, и т.д. Далее мы их рассмотрим более детально, а некоторые из них применим для валидации формы регистрации.

Для начала нам нужно немного преобразовать наш HTML и добавить сообщения об ошибках валидации. В register.html добавляем следующий HTML код.

<form class="form-signin" name="regForm">
    <div class="form-group">
        <label>Email</label>
        <input type="email" name="email" class="form-control" ng-model="user.email">
        <p>Enter a valid email.</p>
    </div>
    <div class="form-group">
        <label>Password</label>
        <input type="password" name="password" class="form-control" ng-model="user.password">
        <p>Min password length is 8 characters.</p>
    </div>
    <button type="button" class="btn btn-lg btn-primary btn-block">Register</button>
</form>

Сохраняем изменения, пере-запускаем сервер, обновляем страницу register. В результате вы должны увидеть следующее:

Как видно из предыдущего скриншота сообщения валидации отображаются вместе с формой. Мы же должны их отображать только в случае, если предоставленные данные неподходящего нам формата.

В AngularJS есть специальное средство ngShow, которое предназначено для отображения какого-то HTML в зависимости от условий (простыми словами это средство представлено в виде атрибута). Таким образом благодаря ngShow мы отобразим сообщение об ошибке, если электронный адрес будет неподходящего нам формата. А как же нам определить, правильный email или нет? В FormController есть свойство $invalid, которое будет равно True в случае если значение поля неверно. Таким образом regForm.email.$invalid будет содержать true, если email неподходящего формата. Если использовать в паре $invalid и ngShow, то можно добиться нужного нам результата:

<p ng-show="regForm.email.$invalid">Enter a valid email.</p>

После сохранения и перезагрузки сервера вы больше не должны видеть на странице сообщения об ошибках. Теперь пробуем ввести какие-то неверные данные и видим, что сообщение всплывает. Пробуем ввести правильный email и видим, что сообщение исчезает. Однако сообщение о неправильной длине пароля до сих пор присутствует. Давайте и это исправим.

Для нужного нам функционала можем воспользоваться атрибутом ng-minlength. Зададим минимальное количество символов и далее воспользуемся ngShow, как это было сделано в предыдущем примере:

<input type="password" name="password" class="form-control" ng-model="user.password" ng-minlength="8">

Далее измените элемент, где находится сообщение об ошибке:

<p ng-show="regForm.password.$error.minlength">Min password length is 8 characters.</p>

Если пользователь введёт пароль из меньшего количества символов, чем мы указали, то regForm.password.$error.minlength будет равно "true" и сообщение об ошибке всплывёт.

Сохраняемся, перезапускаем сервер, обновляем страницу. Вводим маленькую строку в поле пароля и видим сообщение об ошибке.

Теперь неплохо было бы как-то выделить сообщения об ошибках. Сделать это можно с помощью ngClass, отталкиваясь от того же свойства $invalid. Добавляем ngClass прямо в родительский div полей email и password.

<div class="form-group" ng-class="{ 'has-error' : regForm.email.$invalid }">
    <label>Email</label>
    <input type="email" name="email" class="form-control" ng-model="user.email">
    <p class="help-block" ng-show="regForm.email.$invalid">Enter a valid email.</p>
</div>

<div class="form-group" ng-class="{ 'has-error' : regForm.password.$invalid }">
    <label>Password</label>
    <input type="password" name="password" class="form-control" ng-model="user.password" ng-minlength="8">
    <p class="help-block" ng-show="regForm.password.$error.minlength">Min password length is 8 characters.</p>
</div>

Перезагружаем сервак, обновляемся, пробуем ввести неправильные данные и видим следующее:

На данный момент кнопка Register включена даже если данные в форме не верны. Давайте отключим её до тех пор, пока пользователь не устранит все недочёты. В AngularJS есть атрибут ngDisabled, который деактивирует элементы в зависимости от условий. Если email и password не верны, то значения в user.email и user.password не будут заданы. Поэтому мы можем использовать данные поля для определения активности кнопки. Измените кнопку регистрации:

<button type="button" ng-disabled="!user.email || !user.password" class="btn btn-lg btn-primary btn-block">Register</button>

В результате значение ng-disabled будет равно true если user.email и user.password не равны false.

Сохраняем изменения, перезапускаем сервер и обновляем форму регистрации. Кнопка регистрации будет не активна до тех пор пока пользователь не предоставит все данные в нужном формате.

Валидация формы входа пользователя в систему

Теперь давайте немного преобразуем форму входа пользователя в систему и добавим валидацию. Сначала сами можете попробовать, а затем посмотрите готовое решение в home.html:

<form class="form-signin" name="signinForm" role="form">
    <div class="form-group" ng-class="{ 'has-error' : signinForm.email.$invalid }">
        <label>Email</label>
        <input type="email" name="email" class="form-control" ng-model="user.email">
        <p class="help-block" ng-show="signinForm.email.$invalid">Enter a valid email.</p>
    </div>
    <div class="form-group" ng-class="{ 'has-error' : signinForm.password.$invalid }">
        <label>Password</label>
        <input type="password" name="password" class="form-control" ng-model="user.password" ng-minlength="3">
        <p class="help-block" ng-show="signinForm.password.$error.minlength">Min password length is 8 characters.</p>
    </div>
    <label class="checkbox">
        <a href="#/register"> Sign Up</a>
    </label>
    <button ng-disabled="!user.email || !user.password" type="button" ng-click="SignIn($event)" class="btn btn-lg btn-primary btn-block">SignIn</button>
</form>

Заключение

В этом уроке мы создали страницу регистрации и все сопутствующие элементы: маршрут, валидацию, а так же преобразовали форму входа в систему.

В следующей части мы реализуем функционал регистрации пользователя. Исходный код можно найти на GitHub.

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: http://code.tutsplus.com/tutorials/creating-a-web-app-from-scratch-using-angularjs-and-firebase-part-2--cms-22734
Перевел: Станислав Протасевич
Урок создан: 6 Июня 2015
Просмотров: 9778
Правила перепечатки


5 последних уроков рубрики "HTML5"

  • Расширяем возможности HTML за счёт создания собственных тегов

    В этом уроке я покажу процесс создания собственных HTML тегов. Пользовательские теги решают множество задач: HTML документы становятся проще, а строк кода становится меньше.

  • Определение доступности атрибута HTML5 с помощью JavaScript

    Сегодня мы посмотрим, как можно организовать проверку доступности атрибута HTML5 с помощью JavaScript. Проверять будем работу элементов details и summary.

  • HTML5: API работы с вибрацией

    HTML5 - глоток свежего воздуха в современном вебе. Она повлиял не только на классический веб, каким мы знаем его сейчас. HTML5 предоставляет разработчикам ряд API для создания и улучшения сайтов с ориентацией на мобильные устройства. В этой статье мы рассмотрим API для работы с вибрацией.

  • Создание форм с помощью Webix Framework — 4 практических примера

    Веб дизайнеры частенько сталкиваются с необходимостью создания форм. Данная задача не простая, и может вызвать головную боль (особенно если вы делаете что-то не стандартное, к примеру, много-страничную форму). Для упрощения жизни можно воспользоваться фрэймворком. В этой статье я покажу вам несколько практических приёмов для создания форм с помощью фрэймворка Webix.

  • Знакомство с фрэймворком Webix

    В этой статье мы бы хотели познакомить вас с фрэймворком Webix. Для демонстрации возможностей данного инструмента мы создадим интерфейс online аудио плеера. Не обольщайтесь — это всего лишь модель интерфейса. Исходный код доступен в демо и на странице GitHub.

или авторизуйтесь, чтобы добавлять комментарии, оценивать уроки и сохранять их в личном кабинете
  • 18 Июня 2015 16:17
    mrawesome
    Спасибо за перевод! Возник вопрос: как выводить подсказку только в том случае, если инпут имеет класс ng-dirty? т.е. чтобы изначально подсказок на странице не было upd: Нашел решение: myForm.name.$dirty
^ Наверх ^