2016-03-01 5 views
0

я впрыснуть это в мой модуль контроллера:служба завод не работает

var services = angular.module('services', []); 

services.factory('jsonManager', ['$http', function($http) { 

return{ 
    loadData: loadData 
} 

function loadData(){ 
    $http({ 
    method: 'GET', 
    url: 'data/2015_data.json' 
}).then(function successCallback(response) { 
    return response.data; 
    }, function errorCallback(response) { 
    return response.err; 
    }); 
} 

}]); 

... и он не работает! Я использую его на контроллере, как это, проверьте:

var ctrls = angular.module('controllers', ['services']); 

ctrls.controller('overviewController', ['jsonManager', '$scope', 

function(jsonManager, $scope){ 

$scope.load = function(){ 
    var datos = jsonManager.loadData(); 
    console.log(datos); 
    $scope.gastos = datos.gastos.data; 
    $scope.ganancias = datos.ganancias.data; 


} 

Я пропустил код с моего контроллера; объекты области действия работают правильно. Проблема в том, что я получаю сообщение об ошибке, которое говорит мне, что «datos» не определено в строках 55 и 56. Почему это происходит?

+2

вы ничего из не возвращаете 'LoadData()' – Rhumborl

+0

Вы пытаетесь вернуться из асинхронного вызова. Проверьте эту тему http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous-call –

ответ

0

$ HTTP является асинхронным и

console.log(datos); 
$scope.gastos = datos.gastos.data; 

выполняется до jsonManager.loadData(); вернуть его значение

Используйте обратные вызовы или через обещания

function loadData(callback){ 
    $http({ 
    method: 'GET', 
    url: 'data/2015_data.json' 
}).then(function successCallback(response) { 
    callback(null, response.data); 
    }, callback); 
} 

$scope.load = function(){ 
    var datos = jsonManager.loadData(function(err, datos){ 
    console.log(datos); 
    $scope.gastos = datos.gastos.data; 
    $scope.ganancias = datos.ganancias.data; 
    }); 
} 
+0

Это не работает для меня ... продолжает говорить: «datos undefined " – Zerok

+0

@ Zerok отсутствовала ошибка от функции обратного вызова – Jacob

-1

Это асинхронный, поэтому один из способов было бы заставить его решить в $ scope.load так:

$scope.load = function(){ 
    var datos = jsonManager.loadData().then(function(results){return results;}); 
    console.log(datos); 
    $scope.gastos = datos.gastos.data; 
    $scope.ganancias = datos.ganancias.data; 
+0

Почему downvote? – BBauer42

1

$http сервис возвращает обещание, поэтому вам нужно использовать then(successCallback, errorCallback) для решения обещания.

сервис

var services = angular.module('services', []); 
services.factory('jsonManager', ['$http', function($http) { 
    var loadData = function(){ 
     $http({ 
      method: 'GET', 
      url: 'data/2015_data.json' 
     }); 
    return { 
     loadData: loadData 
    }; 
}]); 

контроллер

var ctrls = angular.module('controllers', ['services']); 
ctrls.controller('overviewController', ['jsonManager', '$scope', function(jsonManager, $scope){ 
    $scope.load = function(){ 
     var datos = jsonManager.loadData().then(function(res) { 
      console.log(res.data); 
      $scope.gastos = res.data.gastos.data; 
      $scope.ganancias = res.data.ganancias.data; 
     }, function(err) { 
      console.log(err); 
     }); 
    }; 
}]); 
Смежные вопросы