Данные Angularjs являются нулевыми из асинхронной службы в области

0

заранее спасибо за чтение моего сообщения.

У меня есть сервис, например:

angular.module('myApp.services')
.factory('myService', function($http, $q) {
    var myService = {
        getId: function() {
            var defer = $q.defer();

            $http.get('http://xxxxxxxxxxxxxxxxxx/id/')
            .success( function(data) {
                defer.resolve(data);
            })
            .error( function(data) {
                defer.reject(data);
            });

            return defer.promise;
        },
        begin : function(jsonBegin) {
            var defer = $q.defer();

            $http.post('http://xxxxxxxxxxxxxxxxxxxxxxx/begin/?format=json', jsonBegin)
            .success( function(data) {
                defer.resolve(data);
            })
            .error( function(data) {
                defer.reject(data);
            });

            return defer.promise;
        }
    };

    return myService;
});

Родительский контроллер (отлично работает):

angular.module('myApp.controllers')
.controller('controllerA', function($scope, myService) {
    myService.getId()
        .then(function(data) {
            $scope.bID = data.bID;
        });
});

И детский контроллер:

angular.module('myApp.controllers')
.controller('controllerB', function($scope) {
    console.log($scope.$parent.bID);
});

Значение console.log для bID не определено, знаете ли вы, почему? Я устанавливаю эту переменную в родительском контроллере через службу myService. Думаю, моя проблема связана с асинхронным вызовом, но я не уверен.

Благодарю.

  • 0
    да, ваше предположение верно .. но что вы хотели сделать именно?
  • 1
    Является ли metaApiService тем же, что и myService? Вы хотели изменить его на одно и то же в обоих местах?
Показать ещё 5 комментариев
Теги:
asynchronous
service

2 ответа

1
Лучший ответ

Вы могли бы сделать что-то вроде этого:

     angular.module('myApp.controllers')
        .controller('controllerA', function($scope, myService) {
            $scope.bID = myService.getId()
                .then(function(data) {
                    return data.bID;
                });
        });

    angular.module('myApp.controllers')
        .controller('controllerB', function($scope) {
            $scope.$parent.bID.then(function(bID) { console.log(bID); });
        });

Дочерняя область будет ждать, пока родитель решит bID. И когда родительский BID уже разрешен, он немедленно вернет значение в обещании дочернего объекта. Хотя это немного грязно выглядит.

Альтернативой является разрешение запроса myService до загрузки контроллера. Проверь это:

http://www.codelord.net/2015/06/02/angularjs-pitfalls-using-ui-routers-resolve/

Затем вы можете установить родительскую область в разрешенное значение и получить доступ к ней как к нормальному свойству в области дочерних объектов.

  • 0
    Спасибо @ Dustmouse, позвольте мне проверить ...
  • 0
    Спасибо! Ваш ответ полезен.
0

Проблема заключается в том, что код console.log вызывается, когда контроллер инициализирован, в то время ответ не поступает с результатами на родительском контроллере.

Попробуйте поместить этот код в тестовый контроллер.

angular.module('myApp.controllers')
.controller('controllerB', function($scope, $timeout) {

     // waith 1second for the server response on the parent controller
     $timeout(function(){
         console.log($scope.$parent.bID);
     }, 1000);        
});

FYI. Эта console.log($scope.bID) проверяет наследование области.

  • 0
    Возможная проблема заключается в том, что запрос на обслуживание не возвращается в течение периода ожидания.
  • 0
    @chfumero спасибо, позвольте мне проверить ваш код ...
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню