#javascript #angularjs #angularjs-service #angularjs-factory
#javascript #angularjs #angularjs-сервис #angularjs-factory
Вопрос:
Чтобы решить мою проблему, я просмотрел множество статей на разных сайтах, но ни одна из них не разрешила ее. Я пишу простое приложение AngularJS. Я совсем новичок в Angular. Я написал фабричный метод, который вызывает службу $ http, которая получает данные из веб-api. Веб-api работает нормально и возвращает объект JSON, как и ожидалось.
Угловой код
var app = angular.module("app", [])
.controller("controller", function ($scope, WebFactory) {
$scope.data = "data";
$scope.error = "error";
$scope.data=WebFactory.getData();
})
.factory("WebFactory", function ($http) {
var obj = {};
obj.getData = function()
{
$http({
method: "GET",
url: "http://localhost:37103/api/employee",
}).then(function success(response) {
return response.data;
})
.then(function error(response) {
return response;
});
return 'No data';
}
return obj;
});
HTML-код
<body ng-controller="controller">
data: {{data}}
<br/>
error: {{error}}
<br />
Я потратил 2 дня, но до сих пор не знаю, почему он не работает.
Комментарии:
1. вы видите какие-либо ошибки в консоли?
2. Привет @Sajeetharan, я не вижу никаких ошибок, написано «HTML1300: произошла навигация». Только.
3. Ваш метод getData не имеет особого смысла. $ http() возвращает обещание, которое будет разрешено при получении ответа. Его асинхронный вызов. Итак, из get data вы в любом случае возвращаете «Нет данных». Когда приходит ответ, вы просто обрабатываете его в обратном вызове, но впоследствии он не используется.
4. В fiddler он выдает мне объект JSON, когда я нажимаю на URL.
Ответ №1:
Попробуйте что-то подобное вместо этого:
var app = angular.module("app", [])
.controller("controller", function ($scope, WebFactory) {
$scope.data = "data";
$scope.error = "error";
$scope.data = {}
WebFactory.getData().then(function success(response) {
$scope.data = response.data;
});
})
.factory("WebFactory", function ($http) {
var obj = {};
obj.getData = function()
{
return $http({
method: "GET",
url: "http://localhost:37103/api/employee",
})
}
return obj;
});
Комментарии:
1. Большое вам спасибо @Vladimir. Я получил ваше объяснение, и теперь оно работает 🙂
Ответ №2:
Прежде всего, вам не хватает объявления ng-app
Во-вторых, вы неправильно используете обратный вызов then. Он принимает три параметра: обратный вызов с успехом, обратный вызов с ошибкой, наконец, обратный вызов. Поскольку первый затем завершает работу успешно, затем он выполняет второй обратный вызов, который всегда возвращает ответ, но я предполагаю, что это не так, и вы могли бы использовать функцию get, которая более проста в использовании. Это должно быть:
$http.get("http://localhost:37103/api/employee").then(function(response){
//Do something with successfull response
},
function(error){ //do something with the error});
Смотрите документацию о обещаниях
Наконец, вы имеете дело с обещаниями и асинхронным кодом, но возвращаете ответ или строку вместо обещания с результатом. Итак, getData() должен выглядеть следующим образом:
obj.getData = function(){
return $http.get("http://localhost:37103/api/employee");
}
И используйте обратные вызовы then (success, error, finally) в контроллере или, если вы хотите предоставить значения для обратных вызовов error / finally в службе, вам следует использовать службу $ q
obj.getData(){
var deferred = $q.defer();
$http.get(...).then(function(response){
deferred.resolve(response.data);
},
function(error){
deferred.reject("No Data");
});
return deferred.promise;
}
Конечно, вам пришлось бы предоставить сервис $ q для WebFactory
Комментарии:
1. спасибо за ваш ответ, друг, проблема была с асинхронным вызовом, и Владимир предоставил решение, и с моей стороны все работает нормально.
2. И HTML, который я предоставил, был всего лишь частью страницы. Спасибо