Для того чтобы использовать AJAX следует все голишь запросить сервис $http который позволяет работать с AJAX, далее следует вызвать один из методов которые предоставляет этот сервис(в зависимости от типа запроса который вы хотите сформировать) затем нужно определить метод который будет выполнятся при успешном запросе и который будет выполнятся если запрос не удался (при необходимости). Так же для того чтобы вы могли получить доступ к файлу с расширением *json следует внести изменения в файл web.config
Методы сревиса $http
AngularJS использует технологию promise, суть этой технологии заключается в том что при выполнении асинхронного запроса после его окончания будет выполнен метод который указан в цепочке. Например метод success является promise так как AJAX запрос асинхронный, и этот метод будет выполнен после того как запрос получит ответ от сервера.
Ниже представлен список методов доступных для манипулирования данными полученными в качестве ответа на запрос от сервера
<head> <title></title> <script src="../angular.min%20.js"></script> <link href="../bootstrap-theme.css" rel="stylesheet" /> <link href="../bootstrap.css" rel="stylesheet" /> <script> angular.module("studyModule", []) .controller("studyCtrl", function ($scope, $http) { //$http сервис позволяет работать с ajax $scope.getFruits = function () { $http.get("../data.json").success(function (responseData) { //вызвав метод get сервиса выполняем GET запрос $scope.fruits = responseData; //полученные данные записываем в свойство products на $scope, далее AngularJS самостоятельно обновит все привязки }) } }); </script> </head> <body ng-controller="studyCtrl"> <div id="tasksPanel" class="panel panel-primary" ng-controller="studyCtrl"> <div class="panel-heading"> <div class="panel-title"> <button class="btn btn-success" ng-click="getFruits()"> <h2>Get Fruits!</h2> </button> </div> </div> <div id="panel" class="panel-body"> <div class="row"> <div class="col-sm-4 col-md-4" ng-repeat="fruit in fruits"> <div class="panel panel-primary"> <div class="panel-heading"> <div class="panel-title text-center"> <h3>{{fruit.name}}</h3> </div> </div> <div class="panel-body"> <h3>Cost : {{fruit.price | currency}}</h3> </div> </div> </div> </div> </div> </div> </body> </html>
Использование then метода дает ряд преимуществ, помимо того что вы можете в одном методе определить две функции, в качестве аргумента этим функциям приходит promise объект который содержит дополнительную информацию о запросе:
<head> <title></title> <script src="../angular.min%20.js"></script> <link href="../bootstrap-theme.css" rel="stylesheet" /> <link href="../bootstrap.css" rel="stylesheet" /> <script> angular.module("studyModule", []) .controller("studyCtrl", function ($scope, $http) { $scope.getFruits = function () { $http.get("../data.json").then(function (response) { console.log("Status: " + response.status); console.log("Type: " + response.headers("content-type")); console.log("Length: " + response.headers("content-length")); $scope.fruits = response.data; }) } }); </script> </head> <body ng-controller="studyCtrl"> <div id="tasksPanel" class="panel panel-primary" ng-controller="studyCtrl"> <div class="panel-heading"> <div class="panel-title"> <button class="btn btn-success" ng-click="getFruits()"> <h2>Get Fruits!</h2> </button> </div> </div> <div id="panel" class="panel-body"> <div class="row"> <div ng-hide="fruits.length"> <h3 class="text-center">No Data</h3> </div> <div class="col-sm-4 col-md-4" ng-repeat="fruit in fruits"> <div class="panel panel-primary"> <div class="panel-heading"> <div class="panel-title text-center"> <h3>{{fruit.name}}</h3> </div> </div> <div class="panel-body"> <h3>Cost : {{fruit.price | currency}}</h3> </div> </div> </div> </div> </div> </div> </body> </html>
для работы с xml можно так же использовать jqLite, в данном случае используется метод find() который возвращает jqLite объект который содержит найденные элементы
<!DOCTYPE html> <html ng-app="studyModule"> <head> <title></title> <script src="../angular.min%20.js"></script> <link href="../bootstrap-theme.css" rel="stylesheet" /> <link href="../bootstrap.css" rel="stylesheet" /> <script> angular.module("studyModule", []) .controller("studyCtrl", function ($scope, $http) { $scope.getFruits = function () { $http.get("../xmlData.xml").then(function (response) { $scope.fruits = []; var sourceElems = angular.element(response.data.trim()).find("fruit"); //для работы с xml можно так же использовать jqLite, в данном случае используется метод find() который возвращает //jqLite объект который содержит найденные элементы for (var i = 0; i < sourceElems.length; i++) { var elem = sourceElems.eq(i); //метод eq() используется так как мы работаем с объектом $scope.fruits.push({ name: elem.attr("name"), price: elem.attr("price") }); } }); } }); </script> </head> <body ng-controller="studyCtrl"> <div id="tasksPanel" class="panel panel-primary" ng-controller="studyCtrl"> <div class="panel-heading"> <div class="panel-title"> <button class="btn btn-success" ng-click="getFruits()"> <h2>Get Fruits!</h2> </button> </div> </div> <div id="panel" class="panel-body"> <div class="row"> <div ng-hide="fruits.length"> <h3 class="text-center">No Data</h3> </div> <div class="col-sm-4 col-md-4" ng-repeat="fruit in fruits"> <div class="panel panel-primary"> <div class="panel-heading"> <div class="panel-title text-center"> <h3>{{fruit.name}}</h3> </div> </div> <div class="panel-body"> <h3>Cost : {{fruit.price | currency}}</h3> </div> </div> </div> </div> </div> </div> </body> </html>
xmlData.xm
<fruits> <fruit name="Orange" price="1.20" /> <fruit name="Apple" price="2.42" /> <fruit name="Melon" price="2.02" /> <fruit name="Pear" price="20.45" /> <fruit name="Watermelon" price="17.93" /> <fruit name="Coco" price="14.01" /> <fruit name="Banana" price="11.34" /> <fruit name="Tangerine" price="12.93" /> </fruits>
Как вы уже видели все типы запросов которые можно выполнить с помощью сервиса $http поддерживают в качестве второго параметра конфигурационный объект, с помощью которого можно передать дополнительные данные в запросе:
transformResponse – {function(data, headersGetter)|Array.<function(data, headersGetter)>} – функция преобразования или массив таких функций. Функция преобразования берет тело и заголовки http ответа и возвращает преобразованную (по умолчанию десериализованую) версию.
<!DOCTYPE html> <html ng-app="studyModule"> <head> <title>Ajax</title> <script src="../angular.js"></script> <link href="../bootstrap.css" rel="stylesheet" /> <link href="../bootstrap-theme.css" rel="stylesheet" /> <script> angular.module("studyModule", []) .controller("studyCtrl", function ($scope, $http) { $scope.getFruits = function () { var config = { transformResponse: function (responseData, headers) { fruits = []; var elem = angular.element(responseData.trim()).find("fruit"); for (var i = 0; i < elem.length; i++) { var fruit = elem.eq(i); fruits.push({ name: fruit.attr("name"), price: fruit.attr("price") }); } return fruits; } } $http.get("../xmlData.xml", config).success(function (responseData) { $scope.fruits = responseData; }); } }); </script> </head> <body ng-controller="studyCtrl"> <div id="tasksPanel" class="panel panel-primary" ng-controller="studyCtrl"> <div class="panel-heading"> <div class="panel-title"> <button class="btn btn-success" ng-click="getFruits()"> <h2>Get Fruits!</h2> </button> </div> </div> <div id="panel" class="panel-body"> <div class="row"> <div ng-hide="fruits.length"> <h3 class="text-center">No Data</h3> </div> <div class="col-sm-4 col-md-4" ng-repeat="fruit in fruits"> <div class="panel panel-primary"> <div class="panel-heading"> <div class="panel-title text-center"> <h3>{{fruit.name}}</h3> </div> </div> <div class="panel-body"> <h3>Cost : {{fruit.price | currency}}</h3> </div> </div> </div> </div> </div> </div> </body> </html>
transformRequest – {function(data, headersGetter)|Array.<function(data, headersGetter)>} – функция преобразования или массив таких функций. Функция преобразования берет тело и заголовки http запроса и возвращает преобразованную (по умолчанию сериализованую) версию.
<!DOCTYPE html> <html ng-app="studyModule"> <head> <title></title> <script src="../angular.min%20.js"></script> <link href="../bootstrap-theme.css" rel="stylesheet" /> <link href="../bootstrap.css" rel="stylesheet" /> <script> angular.module("studyModule", []) .controller("studyCtrl", function ($scope, $http) { $scope.getFruits = function () { $http.get("../data.json").success(function (responseData) { $scope.fruits = responseData; }) } $scope.sendXmlData = function () { var config = { headers: { "content-type": "application/xml" }, transformRequest: function (data, headers) { var rootElement = angular.element("<xml>"); for (var i = 0; i < data.length; i++) { var element = angular.element("<fruit>"); element.attr("name", data[i].name); element.attr("price", data[i].price); rootElement.append(element); } rootElement.children().wrap("<fruits>"); return rootElement.html(); } } $http.post("02_transforming_request.html", $scope.fruits, config); } }); </script> </head> <body ng-controller="studyCtrl"> <div id="tasksPanel" class="panel panel-primary" ng-controller="studyCtrl"> <div class="panel-heading"> <div class="panel-title"> <button class="btn btn-success" ng-click="getFruits()"> <h2>Get Fruits!</h2> </button> <button class="btn btn-primary" ng-click="sendXmlData()"> <h2>Send Data</h2> </button> </div> </div> <div id="panel" class="panel-body"> <div class="row"> <div ng-hide="fruits.length"> <h3 class="text-center">No Data</h3> </div> <div class="col-sm-4 col-md-4" ng-repeat="fruit in fruits"> <div class="panel panel-primary"> <div class="panel-heading"> <div class="panel-title text-center"> <h3>{{fruit.name}}</h3> </div> </div> <div class="panel-body"> <h3>Cost : {{fruit.price | currency}}</h3> </div> </div> </div> </div> </div> </div> </body> </html>
если вам нужно установить настройки поу молчанию для запросов с помощью $http то для этого нужно воспользоватся сервисом $httpProvider свойства $httpProvider:
<!DOCTYPE html> <html ng-app="studyModule"> <head> <title></title> <script src="../angular.min%20.js"></script> <link href="../bootstrap-theme.css" rel="stylesheet" /> <link href="../bootstrap.css" rel="stylesheet" /> <script> angular.module("studyModule", []) .config(function ($httpProvider) { $httpProvider.defaults.transformResponse.push(function (responseData, headers) { fruits = []; var fruitElems = angular.element(responseData.trim()).find("fruit"); for (var i = 0; i < fruitElems.length; i++) { var fruit = fruitElems.eq(i); fruits.push({ name: fruit.attr("name"), category: fruit.attr("category"), price: fruit.attr("price") }); } return fruits; }) }) .controller("studyCtrl", function ($scope, $http) { $scope.getFruits = function () { $http.get("../xmlData.xml").success(function (responseData) { $scope.fruits = responseData; }); } }); </script> </head> <body ng-controller="studyCtrl"> <div id="tasksPanel" class="panel panel-primary" ng-controller="studyCtrl"> <div class="panel-heading"> <div class="panel-title"> <button class="btn btn-success" ng-click="getFruits()"> <h2>Get Fruits!</h2> </button> </div> </div> <div id="panel" class="panel-body"> <div class="row"> <div ng-hide="fruits.length"> <h3 class="text-center">No Data</h3> </div> <div class="col-sm-4 col-md-4" ng-repeat="fruit in fruits"> <div class="panel panel-primary"> <div class="panel-heading"> <div class="panel-title text-center"> <h3>{{fruit.name}}</h3> </div> </div> <div class="panel-body"> <h3>Cost : {{fruit.price | currency}}</h3> </div> </div> </div> </div> </div> </div> </body> </html>
interceptor(перехватчик) это некий асоциативный массив который содержит в себе функции предназначенные для перехвата запросов или ответов свойства которые содержит interceptor:
<!DOCTYPE html> <html ng-app="studyModule"> <head> <title></title> <script src="../angular.min%20.js"></script> <link href="../bootstrap-theme.css" rel="stylesheet" /> <link href="../bootstrap.css" rel="stylesheet" /> <script> angular.module("studyModule", []) .config(function ($httpProvider) { $httpProvider.interceptors.push(function () { return { request: function (config) { config.url = "../data.json"; return config; }, response: function (response) { console.log("Fruits Count :" + response.data.length); return response; } } }); }) .controller("studyCtrl", function ($scope, $http) { $scope.getFruits = function () { $http.get("NotExists.xml").success(function (responseData) { $scope.fruits = responseData; }); } }); </script> </head> <body ng-controller="studyCtrl"> <div id="tasksPanel" class="panel panel-primary" ng-controller="studyCtrl"> <div class="panel-heading"> <div class="panel-title"> <button class="btn btn-success" ng-click="getFruits()"> <h2>Get Fruits!</h2> </button> </div> </div> <div id="panel" class="panel-body"> <div class="row"> <div ng-hide="fruits.length"> <h3 class="text-center">No Data</h3> </div> <div class="col-sm-4 col-md-4" ng-repeat="fruit in fruits"> <div class="panel panel-primary"> <div class="panel-heading"> <div class="panel-title text-center"> <h3>{{fruit.name}}</h3> </div> </div> <div class="panel-body"> <h3>Cost : {{fruit.price | currency}}</h3> </div> </div> </div> </div> </div> </div> </body> </html>