2016-02-05 3 views
0

Я зовем мои данные из моего апи через фабрику, которая выглядит следующим образом:

app.factory('Service', ['$http', function ($http) { 

var urlBase = 'http://localhost:50476/api'; 
var Service = {}; 

Service.getComp = function() { 
    return $http.get(urlBase + '/complaints') 

}; 

return Service; 
}]); 

Затем я использую мой контроллер использовать директиву:

getComp(); 
$scope.comp = []; 

function getComp() { 
    var deferred = $q.defer(); 

    Service.getComp() 
    .success(function (comp) { 
     console.log('comp', comp); //returns array data 
     $scope.comp = comp.data; 
     deferred.resolve(comp); 
    }) 
    .error(function (error) { 
     $scope.error = 'error' + error.message; 
    }); 

    return deferred.promise; 
} 

$scope.index = 0; 
$scope.complaints = $scope.comp[0]; 
console.log($scope.complaints); //undefined 
console.log($scope.comp); //array of 0 

Когда я пытаюсь получить доступ к элементам вне функции, он не определен. Я пытался искать разрешения, например, используя $ q, но он пока не отображает данные. Когда я добавил отложенную часть, мой ng-repeat перестает работать.

+0

в то время, когда вы регистрируете $ scope.complaints, это не определено, потому что ответ от запроса $ http еще не возвращен, поэтому ваш «успех», метод еще не выполнен. – o4ohel

ответ

1

Попробуйте это:

getComp(); 
$scope.comp = []; 

function getComp() { 
    return Service.getComp() 
    .success(function (comp) { 
     $scope.comp = comp.data; 
     $scope.complaints = $scope.comp[0]; 
    }) 
    .error(function (error) { 
     $scope.error = 'error' + error.message; 
    }); 
} 

значения не определены, когда вы делаете ваши журналы, потому что эти строки запуска, прежде чем ваш запрос приходит от сервера. Вот почему установка $scope.complaints должна войти в ответный вызов success.

+0

Миллион спасибо. Я пытался понять это на несколько дней. – EPV

0

, если вы хотите, чтобы убедиться, что complaints загружаются на определенных состояниях, прежде чем начать свою логику вы можете использовать UI-маршрутизаторы resolve keyword (я полагаю, вы используете UI-маршрутизатор с ионным - стандартным пакетом)

В вас главным .js

$stateProvider.state('yourState', { 
    resolve: { 
    complaints: function(Service) { 
     return Service.getComp(); 
    } 
    } 
}); 

в контроллере вы можете придать complaints

.controller('myController', function(complaints) { 
    $scope.complaints = complaints; 
}) 

resolve at $ stateProvider блокирует и ждет обещание разрешить ...

Смежные вопросы