Создание приложения на AngularJS и Firebase: Часть 3
В предыдущей части данной серии мы создали страницу регистрации, настроили маршрутизатор, а так же организовали валидацию полей через AngularJS. В этом уроке мы реализуем функционал регистрации через AngularJS и Firebase. Так же подправим механизм входа в систему, согласно новому Firebase API.
Стартуем
Начнём с клонирования второй части кода из предыдущего урока GitHub.
git clone https://github.com/jay3dec/AngularJS_Firebase_Part2.git
После этого отправляемся в каталог проекта и устанавливаем зависимости.
cd AngularJS_Firebase_Part2 npm install
Теперь можно запустить сервер.
npm start
Отправляемся по адресу http://localhost:8000/app/ и видим запущенный проект.
Подключение Firebase
Недавно вышла последняя версия Firebase и FirebaseSimpleLogin для организации входа пользователя в систему. Открываем app/index.html
и вставляем следующие строки подключения:
<script src="https://cdn.firebase.com/js/client/2.0.4/firebase.js"></script> <script src="https://cdn.firebase.com/libs/angularfire/0.9.0/angularfire.min.js"></script>
Реализуем вход пользователя в систему
Отправляемся app/home
и открываем home.js
. Убираем $simplefirebaselogin
из контроллера и передаём $firebaseAuth
. Используем его для создания loginObj
.
.controller('HomeCtrl', ['$scope', '$firebaseAuth', function($scope, $firebaseAuth) { var firebaseObj = new Firebase("https://blistering-heat-2473.firebaseio.com"); var loginObj = $firebaseAuth(firebaseObj); }));
В новом Firebase API есть метод $authWithPassword
для аутентификации, используя email и пароль. Заменяем метод логина на $authWithPassword
в функции SignIn
:
$scope.SignIn = function(e) { e.preventDefault(); var username = $scope.user.email; var password = $scope.user.password; loginObj.$authWithPassword({ email: username, password: password }) .then(function(user) { //Success callback console.log('Authentication successful'); }, function(error) { //Failure callback console.log('Authentication failure'); }); }
Сохраняем изменения, перезагружаем сервер и пробуем войти в систему. В консоли браузера вы должны увидеть сообщение об успешной операции.
Реализация регистрации
Будем использовать Firebase, метод createUser для создания нового пользователя, используя email и пароль. Поскольку валидация была реализована в прошлом уроке, сейчас всё что осталось сделать, привязаться к клику по кнопке. Добавляем атрибут ngClick:
<button type="button" ng-click="signUp();" ng-disabled="!user.email || !user.password" class="btn btn-lg btn-primary btn-block">Register</button>
Открываем register.js
, редактируем RegisterCtrl
, пишем новую функцию signUp
.
.controller('RegisterCtrl', ['$scope', function($scope) { $scope.signUp = function() { // Sign up implementation would be here !! }; }]);
В функции signUp
проверяем валидность данных формы:
$scope.signUp = function() { if (!$scope.regForm.$invalid) { console.log('Valid form submission'); } };
Добавляем атрибут ngController
к body
и register.html
.
<body ng-controller="RegisterCtrl">
Перезагружаем сервер и обновляем страницу. Нажимаем на кнопку Register
после ввода данных. Если заглянуть в консоль, то там должно быть сообщение Valid form submission
.
Перед тем как использовать Firebase API
для создания нового пользователя, нужно передать объект firebase
в само приложение. Открываем register.js
и добавляем модуль firebase.
angular.module('myApp.register', ['ngRoute','firebase'])
Далее нам нужно передать $firebaseAuth
в контроллер регистрации.
.controller('RegisterCtrl', ['$scope','$firebaseAuth', function($scope,$firebaseAuth) {
Используя Firebase URL мы можем получить объект Firebase и использовать его для создания объекта $firebaseAuth
. Далее мы воспользуемся объектом $firebaseAuth
для обращения к API. Добавьте следующий код в register.js
.
var firebaseObj = new Firebase("https://blistering-heat-2473.firebaseio.com"); var auth = $firebaseAuth(firebaseObj);
Теперь нам нужно получить email и пароль из $scope
и вызвать метод createUser
. Преобразуем метод signUp
.
$scope.signUp = function() { if (!$scope.regForm.$invalid) { var email = $scope.user.email; var password = $scope.user.password; if (email && password) { auth.$createUser(email, password) .then(function() { // do things if success console.log('User creation success'); }, function(error) { // do things if failure console.log(error); }); } } };
Как видно из примера мы воспользовались методом $createUser
для создания нового пользователя. Воспользуемся колбэком для вывода результирующего сообщения в лог.
Перезагружаем сервак и отправляемся по адресу http://localhost:8000/app/#/register. Пробуем зарегистрировать нового пользователя, используя email и пароль. Проверяем консоль после клика по кнопке. Если всё прошло успешно, то вы увидите соответствующее сообщение.
Далее отправляемся по адресу http://localhost:8000/app/#/home и пробуем войти, используя свои данные.
Обработка регистрации в колбэках
Создание колбэка для обработки успешной регистрации пользователя
После успешной регистрации пользователя нам нужно отправить его на страницу входа. Для этого можем задействовать AngularJS сервис $location. Делаем как показано ниже:
.controller('RegisterCtrl', ['$scope','$location','$firebaseAuth', function($scope,$location,$firebaseAuth) {
Теперь используем в функцию auth.$createUser
и перенаправляем пользователя.
$location.path('/home');
Сохраняемся, перезагружаем сервер и пробуем зарегистрировать нового пользователя. После этого вы должны попасть на страницу входа в систему.
Создание колбэка для обработки неудачной регистрации пользователя
Регистрация пользователя может провалиться по нескольким причинам: к примеру если пользователь с такими данными уже зарегистрирован. Поэтому нам нужно сообщить пользователю, если что-то пошло не так. Добавим ещё одно сообщение об ошибке после поля пароля. Вот как оно будет выглядеть:
<p style="color:red;" ng-show="regError">{{regErrorMessage}}</p>
Как видно из примера мы воспользовались атрибутом ngShow
для отображения ошибки в случае если regError
будет равно true
. Сообщение будет отображено согласно переменной regErrorMessage
. Добавьте следующий код в колбэк createUser
.
$scope.regError = true; $scope.regErrorMessage = error.message;
Вот функция signUp
со всеми изменениями:
$scope.signUp = function() { if (!$scope.regForm.$invalid) { var email = $scope.user.email; var password = $scope.user.password; if (email && password) { auth.$createUser(email, password) .then(function() { // do things if success console.log('User creation success'); $location.path('/home'); }, function(error) { // do things if failure console.log(error); $scope.regError = true; $scope.regErrorMessage = error.message; }); } } };
Сохраняем изменения, перезагружаем сервер и пробуем зарегистрировать уже существующего пользователя. В результате мы должны увидеть сообщение об ошибке:
Создание главной страницы
После успешного входа в систему мы должны отправить пользователя на главную страницу. Там в последствии будем отображать посты, созданные юзером. Давайте создадим главную страницу.
Отправляемся в каталог приложения и создаём новую папку под названием welcome
. В ней будем хранить шаблоны, связанные с главной страницей. Внутри welcome
создаём файлы welcome.html
и welcome.js
. Добавляем следующую разметку в welcome.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="blog.css" rel="stylesheet"> </head> <body ng-controller="WelcomeCtrl"> <div class="blog-masthead"> <div class="container"> <nav class="blog-nav"> <a class="blog-nav-item active" href="#">Home</a> <a class="blog-nav-item " href="addPost.html">Add Post</a> </nav> </div> </div> <div class="container"> <div class="page-header"> <h1>AngularJS & Firebase App</h1> </div> <p class="lead">Welcome home !!</p> </div> <footer class="footer"> <div class="container"> <p class="text-muted"></p> </div> </footer> </body> </html>
В welcome.js
сконфигурируем маршрут. Воспользуемся $routeProvider
для создания маршрута к представлению welcome
. При создании нового маршрута воспользуемся templateUrl
который будет направлять на index.html
. В то же время мы создадим контроллер. Вот как будет выглядеть welcome.js
:
'use strict'; angular.module('myApp.welcome', ['ngRoute']) .config(['$routeProvider', function($routeProvider) { $routeProvider.when('/welcome', { templateUrl: 'welcome/welcome.html', controller: 'WelcomeCtrl' }); }]) .controller('WelcomeCtrl', ['$scope', function($scope) { }]);
Теперь открываем app/app.js
и добавляем новый модуль.
angular.module('myApp', [ 'ngRoute', 'myApp.home', 'myApp.register', 'myApp.welcome' // Newly added module ])
Так же открываем app/index.html
и подключаем скрипт register.js
.
<script src="welcome/welcome.js"></script>
Перенаправляем пользователя на главную в случае успешного входа в систему. Открываем app/home/home.js
и передаём $location
в HomeCtrl
.
.controller('HomeCtrl', ['$scope','$location','$firebaseAuth',function($scope,$location,$firebaseAuth) {
Воспользуемся объектом $location
для перенаправления пользователя на главную страницу. В home.js
, внутри функции SignIn
, в случае успеха выполняем следующий код:
$location.path('/welcome');
Сохраняем изменения, перезапускаем сервер и пробуем войти. В случае успеха мы должны увидеть следующее:
Доступ к $scope между контроллерами
Теперь давайте отобразим email вошедшего пользователя. Тут есть один нюанс: во время входа пользователя все его данные доступны в HomeCtrl
, но после перенаправления объект $scope
HomeCtrl
не доступен в WelcomeCtrl
. Для того чтобы это стало возможно воспользуемся AngularJS сервисом.
Используя сервисы мы можем осуществлять доступ к каким-то ресурсам. Внутри home.js
создаём сервис CommonProp
.
.service('CommonProp', function() { var user = ''; return { getUser: function() { return user; }, setUser: function(value) { user = value; } }; });
В сервисе CommonProp
создаём переменную под названием user, куда запишем email пользователя. Теперь можем получить эти данные из любого контроллера.
Теперь передаём CommonProp
в HomeCtrl
:
.controller('HomeCtrl', ['$scope','$location','CommonProp','$firebaseAuth',function($scope,$location,CommonProp,$firebaseAuth) {
При успешной аутентификации задаём переменную user
через сервис CommonProp
.
CommonProp.setUser(user.password.email);
Так же передаём CommonProp
в WelcomeCtrl
welcome.js
.
.controller('WelcomeCtrl', ['$scope','CommonProp', function($scope,CommonProp) {
В welcome.html
преобразуем сообщение.
<p class="lead">Welcome home <b>{{username}}</b> !!</p>
Теперь в WelcomeCtrl
записываем в $scope.username
значение из сервиса CommonProp
, используя метод getUser
.
$scope.username = CommonProp.getUser();
Сохраняем изменения, перезагружаем сервер и пробуем войти. При успехе видим следующее:
Заключение
В этом уроке мы продвинулись дальше в создании нашего приложения на AngularJS и Firebase. Мы реализовали функционал регистрации и входа пользователя в систему, а так же ознакомились с сервисами.
В следующей части будем реализовывать создание нового поста.
Исходный код доступен на GitHub.
Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: http://code.tutsplus.com/tutorials/creating-a-web-app-from-scratch-using-angularjs-and-firebase-part-3--cms-22737
Перевел: Станислав Протасевич
Урок создан: 13 Июня 2015
Просмотров: 7515
Правила перепечатки
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.