Ionic + AngularJs - Controller无法获取Services

时间:2016-02-24 22:09:50

标签: angularjs ionic-framework

我有这个视图代码:

> <label class="item item-input item-select">    <i class="icon
> ion-android-map icon-color"></i>&nbsp;
>       <span class="input-label">Estado</span>
>       <select ng-model="meuEstado" required>
>         <option value="0">Selecione...</option>
>         <option ng-repeat="estado in listaEstados" value="{{ estado.idEstado }}">{{ estado.nmEstado }}&nbsp;-&nbsp;{{
> estado.ufEstado }}</option>
>       </select>    </label>

以下是我的服务:

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

starter.factory('appFactory', ['$http', function($http) {

        listaEstados: function(local) {

            var resultado = null;

            var dataToSend = {
                type   : 'recuperarestados'
            };

            $http({
                url: 'http://....',
                method: 'POST',
                data: dataToSend
            }).success(function(response, status, headers, config) {
                return resultado = response;
            }).error(function(err, status, headers, config) {
                return resultado = null;      
            }); 
        }
    };
}]);

这是json返回的:

  

[{“idEstado”:“7”,“ufEstado”:“DF”,“nmEstado”:“Distrito   Federal“},{”idEstado“:”9“,”ufEstado“:”GO“,”nmEstado“:   “Goiás”},{“idEstado”:“11”,“ufEstado”:“MG”,“nmEstado”:“Minas   Gerais“},{”idEstado“:”19“,”ufEstado“:”RJ“,”nmEstado“:”Rio de   Janeiro“},{”idEstado“:”23“,”ufEstado“:”RS“,”nmEstado“:”Rio   Grande do Sul“},{”idEstado“:”26“,”ufEstado“:”SP“,”nmEstado“:   “圣保罗”}]

这是我的控制器的一部分:

starter.controller('homeCtrl', ['$scope', '$location', '$state', '$ionicHistory', '$ionicLoading', '$timeout', 'appFactory', 
    function($scope, $location, $state, $ionicHistory, $ionicLoading, $timeout, appFactory) {

    $scope.meuEstado = "0"
    $scope.listaEstados = [];

    $ionicLoading.show({
        templateUrl:"templates/spinner.html",
        animation: 'fade-in',
        showBackdrop: true,
        maxWidth: 200,
        showDelay: 0
    });

    $scope.listaEstados = appFactory.listaEstados(local);

    //Define o tempo para remover o loader, 
    $timeout(function () {
        $ionicLoading.hide();
    }, 2000);
}]);

我的问题是我的服务可以从我的后端获取数据,但我无法从我的控制器获取此数据,也可以在视图上加载我的$ scope.listaEstados。

我注意到在Stackoverflow中的一些帖子中我需要使用“$ scope。$ apply”,但我已经尝试过但没有成功。

有人可以告诉我在代码中需要做哪些更改,以便在控制器中获取数据?

感谢。

1 个答案:

答案 0 :(得分:0)

您应该使用$q

执行此操作

服务:

starter.factory('appFactory', ['$http','$q', function($http,$q) {


    listaEstados: function() {
        var deferred=$q.defer();
        var resultado = null;

        var dataToSend = {
            type   : 'recuperarestados'
        };

        $http({
            url: 'http://....',
            method: 'POST',
            data: dataToSend
        }).success(function(response, status, headers, config) {
            deferred.resolve(response);
        }).error(function(err, status, headers, config) {
            deferred.reject(response);    
        }); 
        return deferred.promise;
    }
};
}]);

在控制器中:

starter.controller('homeCtrl', ['$scope', '$location', '$state', '$ionicHistory', '$ionicLoading', '$timeout', 'appFactory', 
function($scope, $location, $state, $ionicHistory, $ionicLoading, $timeout, appFactory) {

$scope.meuEstado = "0"
$scope.listaEstados = [];

$ionicLoading.show({
    templateUrl:"templates/spinner.html",
    animation: 'fade-in',
    showBackdrop: true,
    maxWidth: 200,
    showDelay: 0
});

appFactory.listaEstados().then(function(success){
     $scope.listaEstados=success;
},function(error){
     //Something to handle error
})

//Define o tempo para remover o loader, 
$timeout(function () {
    $ionicLoading.hide();
}, 2000);

}]);