Как создать простое веб-приложение с использованием AngularJS и Parse в качестве серверной части менее чем за день
Без особой причины я хотел изучать разработку веб-приложений. Существует множество фреймворков, упрощающих разработку веб-приложений. Но я решил пойти к тому, что сделал король Интернета, Google. Я поделюсь, как я сделал этот дурацкий генератор кликбейтных заголовков за несколько часов, используя AngularJS.
Несколько замечаний, прежде чем я начну: я использую Mac с Yosemite. Для текстового редактора я использую Atom. Исходный код генератора кликбейтов находится на Github. На самом деле само веб-приложение размещено на Github, потому что нет необходимости в веб-сервере. Последние заголовки хранятся в Парсе.
Теперь поговорим о приложении. Приложение предоставит пользователю два текстовых поля: текстовое поле кто и текстовое поле что делает. После заполнения обоих полей приложение автоматически покажет сгенерированный заголовок. В приложении также есть кнопка «Создать», которая будет случайным образом выбирать преувеличенные выражения для создания кликбейтного заголовка. Пользователь также может отправить заголовок, и он будет показан в разделе недавно созданных заголовков. Довольно просто.
При разработке приложения для iOS я могу просто открыть Xcode, создать новый проект и, бум, Xcode предоставит все файлы, необходимые для быстрого начала работы. Для разработки веб-приложений есть Йомен. Если вы проверите веб-сайт, вы можете легко установить его с помощью npm.
npm install -g yo
После установки Yeoman устанавливаем Угловой генератор.
npm install -g grunt-cli bower yo generator-karma generator-angular
Теперь создайте каталог для проекта. Затем внутри каталога создайте новое угловое приложение, используя yoman:
yo angular clickbait
Бум. Yeoman создаст все необходимые файлы. Как только это будет сделано, вы можете просмотреть приложение, запустив grunt, средство запуска задач.
grunt serve
Аргумент serve открывает ваше приложение в браузере и перезагружает его при обнаружении изменений.
Йоман сгенерировал для вас несколько контроллеров, маршрутов и представлений. Но я этого не знал и в итоге создал новый маршрут с именем home, используя
yo angular:route home
Вы можете использовать сгенерированный маршрут или просто создать новый. Когда вы запустите приведенную выше команду, она создаст контроллер, представление и настроит маршрут в app/scripts/app.js.

Код маршрута в app.js довольно прост для понимания. Открытие веб-приложения приведет к перенаправлению на '/', который загрузит views/home.html и HomeCtrl. Если вы посмотрите на app/index.html, вы увидите
<div class=”container”> <div ng-view=””></div> </div>
Angular отобразит home.html в div с директивой ng-view.
Давайте шаг за шагом рассмотрим файл views/home.html.
<p>Who? <input ng-model=”who” placeholder=”A man, A woman, etc”></p> <p>Doing what? <input ng-model=”doing” placeholder=”sitting on the beach”></p> <p><span ng-bind=”result()” class=”result”></span></p>
Первая строка показывает Кто? с текстовым полем. Мы используем директиву ng-model='who' для привязки значения текстового поля к переменной 'who', к которой мы будем обращаться в контроллере Home. То же самое и с текстовым полем Doing. Затем мы показываем сгенерированный заголовок в теге span. Мы связываем тег span с функцией result(), которая будет доступна в Home Controller с помощью директивы ng-bind='result()'.
В файле controllers/home.js для домашнего контроллера я добавил
$scope.result = function() {
if (!$scope.who || !$scope.doing) {
$scope.buttonDisplay = false;
return ‘’;
}
$scope.buttonDisplay = true;
return $scope.who+’ ‘+$scope.doing+’. ‘+$scope.bait;
};
Это функция result(), которая возвращает сгенерированный заголовок. Если кто и oing пусты, мы возвращаем пустую строку. Когда пользователь вводит что-то в текстовом поле who и doing, Angular автоматически обновит значение переменных who и doing, что в результате автоматически обновит возвращаемое значение функции results(). . Поскольку мы связываем содержимое тега span с функцией result(), сгенерированный заголовок появится автоматически. Довольно круто.
Та же концепция применима к видимости кнопок. Для динамического изменения видимости элементов в Angular предусмотрена директива ng-show. Таким образом, просто назначив переменную этой директиве, мы можем показать или скрыть элемент, назначив true или false в контроллере. В этом приложении я использовал переменную buttonDisplay для управления видимостью.
Далее нам нужно разрешить приложению общаться с сервисом Parse. Официальной поддержки Angular от Parse нет, но есть патч с открытым исходным кодом для Parse SDK для изначальной работы с AngularJS. Но поскольку все, что я хотел сделать, это просто получить последние заголовки и опубликовать заголовок, я решил, что могу просто подключиться к Parse с помощью REST API.
Вначале я использовал службу Angular $http для отправки запросов POST и GET в Parse внутри домашнего контроллера.
// to fetch
var req = {
method: 'GET',
url: 'https://api.parse.com/1/classes/Pool?order=-createdAt&limit=100',
headers: {
'X-Parse-Application-Id': 'parse-app-id',
'X-Parse-REST-API-Key': 'parse-api-key',
'Content-Type': 'application/json'
},
};
$http(req).success(function (data) {
var results = data.results;
$scope.titles = results;
if ($scope.titles.length > 0) {
$scope.poolDisplay = true;
}
}).error(function () {
});
// to submit title
var req = {
method: 'POST',
url: 'https://api.parse.com/1/classes/Pool',
headers: {
'X-Parse-Application-Id': 'parse-app-id',
'X-Parse-REST-API-Key': 'parse-api-key',
'Content-Type': 'application/json'
},
data: {
'title': title
}
};
$http(req).success(function () {
$scope.submitDisabled = false;
$scope.reloadPool();
}).error(function () {
$scope.submitDisabled = false;
});
Но есть лучший способ избежать повторения. Мы можем создать собственный сервис Angular, который будет служить клиентом для Parse.
yo angular:factory Title
Это создаст файл services/title.js, в котором мы сможем реализовать наш клиент RESTful. Я использовал сервис ngResource для взаимодействия с Parse.
// services/title.js
angular.module(‘RestService’, [‘ngResource’])
.factory(‘Title’, [‘$resource’, function ($resource) {
var clickbaitAppHeaders = {
‘X-Parse-Application-Id’: ‘parse-app-id’,
‘X-Parse-REST-API-Key’: ‘parse-api-key’,
‘Content-Type’: ‘application/json’
};
return $resource(‘https://api.parse.com/1/classes/Pool', {}, {
get: {
method: ‘GET’,
params: {
‘order’: ‘-createdAt’,
‘limit’: 100
},
headers: clickbaitAppHeaders
},
post: {
method: ‘POST’,
params: {
title: ‘’
},
headers: clickbaitAppHeaders
}
});
}]);
Теперь, когда у нас есть служба под названием Title, мы можем использовать ее в нашем контроллере.
// scripts/controllers/home.js
angular.module(‘clickbaitApp’)
.controller(‘HomeCtrl’, [‘$scope’, ‘$http’, ‘Title’, function ($scope, $http, Title) {
...
Title.get({}, function (res) {
$scope.titles = res.results;
if ($scope.titles.length > 0) {
$scope.poolDisplay = true;
}
});
Мы получаем заголовки из Parse и присваиваем их переменной 'titles'. Все, что нам нужно для их отображения, — это привязать некоторые элементы в представлении к этой переменной. Для отображения нескольких элементов в Angular есть директива ng-repeat.
// views/home.html
<div ng-repeat=”title in titles”>
<span am-time-ago=”title.createdAt” class=”createdAt”></span> {{title.title}} <a href=”https://twitter.com/intent/tweet?text={{textToTweetForTitle(title.title)}}" target=”_blank”>Tweet this</a>
</div>
В основном это означает, что для каждого элемента в переменной titles повторяются элементы внутри тега div. Переменная titles — это массив, содержащий объекты, полученные из Parse. Итак, чтобы отобразить заголовок каждого из объектов, нам нужно получить свойство title этого объекта.
{{title.title}}
И это все. Вы можете изучить код в Github или просмотреть Учебник по AngularJS. Существует несколько способов развернуть веб-приложение Yeoman в рабочей среде. Я просто использовал поддерево git для развертывания на страницах github.
grunt build git subtree push --prefix dist origin gh-pages
Это было довольно весело. Самое приятное то, что приложение может быть онлайн и доступно для людей, чтобы попробовать его немедленно. Нет необходимости ждать неделю, чтобы выпустить приложение.
Что ж, вернемся к созданию приложений для iOS. Вы проверили мои приложения?