Я пытаюсь вернуть HTTP-запрос от остального api url внутри фабрики. Но это не возвращает данные, а вместо функции. Когда я использую консольный журнал внутри контроллера, он показывает всю функцию.
MyApp.factory('userFactory', function($http) {
var factory = [];
factory.users = function(){
$http({
url: '/test/users',
method: 'GET'
})
.then(function successCallback(response) {
factory.users = response;
}, function errorCallback(response) {
factory.users = response;
});
return factory.users;
};
return factory;
});
Я делаю то же самое в своих проектах. Ознакомьтесь с репо здесь: https://github.com/ahmadabdul3/mean-flapperNews/tree/master/public/Index/angular
httpService - мой обработчик http. Затем вы можете посмотреть службу postsService, увидеть мою функцию getAllPosts
в основном, как говорится в комментариях, вы должны вернуть обещание и обработать его в контроллере
поэтому вы делаете это так:
function getAllPosts() {
httpService.baseGet(httpUrls.posts)
.then(function(data) {
angular.copy(data, posts);
posts.push({title: 'post test', link: '', upvotes: 3, comments: []});
}, function(data) {
httpService.handleError(data);
});
}
и у вас есть служба http:
angular.module('httpService', [])
.factory('httpService', httpService);
httpService.$inject = ['$http', '$q'];
function httpService($http, $q) {
var serv = this;
var methods = {
httpGet : 'GET',
httpPost : 'POST',
httpPut : 'PUT',
httpDelete : 'DELETE'
};
function baseGet(url) {
return $http.get(url).then(
function (result) {
return result.data;
},
function (result) {
return $q.reject(result);
}
);
}
function httpWithParams(url, method, data) {
return $http({
url: url,
method: method,
params: data,
dataType: "json",
headers: {
"Content-Type": "application/json"
}
}).then(
function (result) {
console.log(result.data);
return result.data;
},
function (result) {
return $q.reject(result);
}
);
}
function handleError(error) {
console.log(error);
}
return {
baseGet: baseGet,
httpWithParams: httpWithParams,
handleError: handleError,
methods: methods
}
}
См. $ Http docs - он возвращает обещание, поэтому вам нужно обработать его соответствующим образом. У вас также есть некоторые конфликты в названии переменных, которые не помогут решить эту проблему.
Я предлагаю следовать руководству по угловому стилю johnpapa - и в этом случае правилу данных. У вас больше всего этого.
Вы можете либо выполнить обещание в контроллере, как показано ниже, либо использовать сеттер (getUser/setUsers на заводе для обмена между контроллерами/проблемами).
MyApp.factory('userFactory', function($http) {
// Expose public API first, use func notation
return {
getUsers: getUsers,
};
function getUsers(){
return $http.get('/test/users');
}
});
MyApp.controller('UserController', function(userFactory) {
// bindables up top
vm.users = [];
activate();
//separate activation logic / promise resolution
function activate(){
userFactory.getUsers().then(function(users){
vm.users = users.data;
});
}
});
$http.get
), но я думаю, что проблема заключается в том, что вам нужно вернуть обещание $ http. Попробуйтеfactory.users = function() { return $http(...
и мы можем перейти оттуда.response.data
, но вы не можете преобразовать функцию в объект внутри самой функции ... (т.е.factory.users
- это функция, и поэтому внутри этой функции пытаются назначитьfactory.users
другому объект не будет работать).