Сервис $http и ajax-запросы

Последнее обновление: 27.04.2017

Сервис $http представляет ключевой сервис Angular, предназначенный для взаимодействия с удаленным HTTP-сервером через объект XMLHttpRequest или через JSONP. Посмотрим на примере, модифицировав приложение из прошлой темы. Во-первых, выделим все необходимые нам данные в какой-то внешний файл, например, question.json, который будет находиться рядом со страницей index.html. Он будет содержать данные в формате json:

{
    "question":{
        "text": "Какой js-фреймворк лучше использовать?",
        "author": "Иван Иванов",
        "date": "20/10/2013",
        "answers":
        [{
            "text": "AngularJS!",
            "author": "Вова Сидоров",
            "date": "20/10/2013",
            "rate":2
        },{
            "text": "AngularJS лучше всех",
            "author": "Олег Кузнецов",
            "date": "21/10/2013",
            "rate":3
        }]
    }
}

Теперь используем в контроллере QuestionController сервис $http:

questApp.controller('QuestionController', 
    function QuestionController($scope, $http){
     
		$http({method: 'GET', url: 'question.json'}).
            then(function success(response) {
                $scope.question=response.data.question;
        });
     
        $scope.voteUp = function (answer){
            answer.rate++;
        };
        $scope.voteDown = function (answer){
            answer.rate--;
        };
    }
)

Что тут надо отметить? Во-первых, если в прошлой теме про сервисы передался сделанный нами сервис в функцию QuestionController, то теперь в качестве второго параметра мы передаем в нее сервис $http.

Во-вторых, надо отметить синтаксис использования сервиса:

$http({method: 'GET', url: 'question.json'}).
            then(function success(response) {
                $scope.question=response.data.question;
});

Для обращения к определенному ресурсу (в данном случае к файлу question.json) сервис $http использует метод get, который выполняет GET-запрос протокола http. Ресурсом необязательно должен выступать файл в формате json, это может быть и любой ресурс, который передает клиенту объекты в формате json, например, веб-серсис на ASP.NET, скрипт на PHP, Ruby и т.д.

Далее идет функция then, в которую в качестве первого параметра передается функция, которая срабатывает, если обращение к ресурсу прошло успешно - здесь мы берем из полученного объекта data, который содержит весь вышеопределенный файл в формате json и выбираем в нем объект верхнего уровня question. Затем этот объект передаем в представление.

Таким образом, данные передаются в представление, а саму страницу index.html при этом мы можем оставить такой же, как и в прошлой теме:

<!doctype html>
<html ng-app="questApp">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/mystyles.css" />
</head>
<body>
<div  ng-controller="QuestionController">
<div class="content">
<div class="quest">
<h3>{{question.text}}</h3>
<p>{{question.author}} </p> <p><i>{{question.date}}</i></p>
</div>
<h3>Ответы</h3>
<div class="answers">
<div ng-repeat="answer in question.answers | orderBy:sortparam" class="answer">
<div class="vote">
    <a class="vote-up" ng-click="voteUp(answer)"></a>
    <span class="rate">{{answer.rate}}</span>
    <a class="vote-down" ng-click="voteDown(answer)"></a>
</div>
<b>{{answer.text}}</b>
<p>{{answer.author}}</p>
<p><i>{{answer.date}}</i></p>
</div>
</div>
</div>
<script src="js/lib/angular.min.js"></script>
<script src="js/app.js"></script>
<script src="js/controllers/QuestionController.js"></script>
</body>
</html>

Немного изменим пример. Пусть у нас данные загружаются по нажатию кнопки:

questApp.controller('QuestionController',
    function QuestionController($scope, $http){
     
        $scope.loaded=false;
     
		$scope.load = function (){
            $http({method: 'GET', url: 'question.json'}).
				then(function success(response) {
					$scope.question=response.data.question;
					$scope.loaded=true;
			});
        };
        $scope.voteUp = function (answer){
            answer.rate++;
        };
        $scope.voteDown = function (answer){
            answer.rate--;
        };
    }
)

А в блоке с данными создадим кнопку для загрузки данных:

<!doctype html>
<html ng-app="questApp">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/mystyles.css" />
</head>
<body>
<div  ng-controller="QuestionController">
<button ng-click="load()">Загрузить</button>
<div class="content"  ng-show="loaded">
<div class="quest">
<h3>{{question.text}}</h3>
<p>{{question.author}} </p> <p><i>{{question.date}}</i></p>
</div>
<h3>Ответы</h3>
<div class="answers">
<div ng-repeat="answer in question.answers | orderBy:sortparam" class="answer">
<div class="vote">
    <a class="vote-up" ng-click="voteUp(answer)"></a>
    <span class="rate">{{answer.rate}}</span>
    <a class="vote-down" ng-click="voteDown(answer)"></a>
</div>
<b>{{answer.text}}</b>
<p>{{answer.author}}</p>
<p><i>{{answer.date}}</i></p>
</div>
</div>
</div>
<script src="js/lib/angular.min.js"></script>
<script src="js/app.js"></script>
<script src="js/controllers/QuestionController.js"></script>
</body>
</html>

А весь блок с данными теперь перемешен в отдельный элемент div, видимостью которого управляет объект loaded.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850