Я пытаюсь передать объект json в свой метод factory.login
чтобы я мог его использовать.
Это мой код:
Функция контроллера
var data = {email:'test','password':'test'};
vm.login = function() {
employeeFactory.login(vm.url, vm.data)
.then(function(response) {
console.log(response);
}, function(data)
{
console.log(data.status);
});
}
завод
factory.login = function(url,data) {
return $http({
'method': 'POST',
'url': url,
'data': $.param(
data
),
'headers': {
'Content-Type': 'application/x-www-form-urlencoded'
}
});
}
return factory;
Но ошибка:
angular.js:13294 TypeError: Cannot read property 'jquery' of undefined
at Function.n.param (jquery-2.2.2.min.js:4)
at Object.factory.login (employeeFactory.js:14)
at employeeController.vm.login (employeeController.js:16)
at fn (eval at <anonymous> (angular.js:14138), <anonymous>:4:285)
at b (angular.js:15151)
at e (angular.js:24674)
at m.$eval (angular.js:16895)
at m.$apply (angular.js:16995)
at HTMLButtonElement.<anonymous> (angular.js:24679)
at HTMLButtonElement.n.event.dispatch (jquery-2.2.2.min.js:3)
Это должно быть vm.data
vm.data = {email:'test','password':'test'};
И фабрика вообще не требует jQuery, просто используйте ниже конструкцию
factory.login = function(url,data) {
return $http({
'method': 'POST',
'url': url,
//don't use $.param, as you need jQuery dependency for that
//for x-www-form-urlencoded you have to use this construction
//email=test&password=test
'data': 'email=' + data.email + '&password=' + data.password,
'headers': {
'Content-Type': 'application/x-www-form-urlencoded'
}
});
}
return factory;
Но рассмотрите возможность использования типа JSON для обработчика запросов сервера, поскольку это намного проще
JSON - это формат для сериализации объекта, поэтому это строка. У вас есть объект как данные, содержащие данные, которые необходимо отправить на сервер, поэтому просто выполните следующие действия:
Просто поместите в него свой объект данных:
factory.login = function(url,data) {
return $http({
'method': 'POST',
'url': url,
'data': data
});
}
return factory;
Угловой будет отправлять json на сервер в полезной нагрузке. Вам не нужно делать сериализацию самостоятельно.
Документация https://docs.angularjs.org/api/ng/service/ $ http → Преобразования по умолчанию ->
Запросить преобразования ($ httpProvider.defaults.transformRequest и $ http.defaults.transformRequest):
Если свойство данных объекта конфигурации запроса содержит объект, сериализуйте его в формате JSON. Преобразования ответов ($ httpProvider.defaults.transformResponse и $ http.defaults.transformResponse):
Если обнаружен префикс XSRF, разделите его (см. Раздел "Вопросы безопасности" ниже). Если обнаружен ответ JSON, десериализуйте его с помощью анализатора JSON.
Трассировка стека показывает следующую ошибку:
TypeError: Cannot read property 'jquery' of undefined
miss match variable использует объявленные var data = {}
но использует vm.data
в вашем контроллере. должен объявить
vm.data= {email:'test','password':'test'}
или
используйте data
в employeeFactory.login(vm.url, data)
если объявить как var data= {}
и на вашем заводе нет необходимости использовать $.param
можно отправить как аргумент в методе post, например
$http.post(url, data, [{headers: { 'Content-Type' : 'application/x-www-form-urlencoded'}]);
Ваш JSON кажется неправильным. Должно быть:
var data = { "email": "test", "password": "test"};
Также $http.post
функция $http.post
:
$http.post(url, data, [{headers: { 'Content-Type': 'application/x-www-form-urlencoded'}]);