目前我一直在玩角度,我发现很难弄明白。问题是我在app.run()上运行$ http方法。 $ http方法从服务器获取空间并在$ rootScope.rooms var中初始化它。在控制器中我使用了这个房间变量。由于$ http方法是异步的,有时它因为控制器在方法完成之前加载而变为null。我试图以其他方式处理它。
angular.module('GameModule', [])
.run([function ("injectors...") {
$http.get("/rooms").success(function(result){
$rootScope.rooms = result;
}).error(function(error){
console.log('Error fetching rooms');
});
}])
.controller('GameCtrl', ['$scope', function ($scope) {
console.log($rootScope.rooms);
}]);
由于room变量也将在其他文件中使用,我不想在每个控制器中放入$ http方法,除非没有其他方法。如果我可以使用某种角度的服务
那会很好答案 0 :(得分:2)
这是angularJs的正常行为,因为每个REST调用都是异步的。如果您希望它更易于管理或以同步方式运行,那么您将不得不使用" promise" (angularJs中的$ q服务)。请找到代码段
服务代码:(您想要使用)
app.lazyload.factory('myService',['$http','$q', function($http,$q) {
return{
showAll :function ()
{
var deferred = $q.defer();
$http.post('rest/getAll?cd='+ (new Date()).getTime())
.success(function(data)
{
deferred.resolve(data);
})
.error(function(data)
{
deferred.reject(null);
console.log("in error block");
});
return deferred.promise;
}
};
}]);
控制器代码:(致电服务)
function showAll()
{
var promise = myService.showAll();
promise.then(function success(data) {
$scope.allitems = data;
console.log(data);
console.log('$scope.allitems'+$scope.allitems[0].name);
}, function error(msg) {
console.error(msg);
});
};
我已经更新了我的答案。将showAll()调用放在控制器主体的开头。根据您的问题,我假设您要在初始化时加载一些数据。这种方法可以得到相同的结果。