заранее спасибо за чтение моего сообщения.
У меня есть сервис, например:
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. Думаю, моя проблема связана с асинхронным вызовом, но я не уверен.
Благодарю.
Вы могли бы сделать что-то вроде этого:
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/
Затем вы можете установить родительскую область в разрешенное значение и получить доступ к ней как к нормальному свойству в области дочерних объектов.
Проблема заключается в том, что код 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)
проверяет наследование области.