我有从填充到我的观点的服务的问题中获取数据。 我有一个服务定义为这样的
app.factory('nukeService', function($rootScope, $http) {
var nukeService = {};
nukeService.nuke = {};
//Gets the list of nuclear weapons
nukeService.getNukes = function() {
$http.get('nukes/nukes.json')
.success(function(data) {
nukeService.nukes = data;
});
return nukeService.nukes;
};
return nukeService;
});
和我的控制器
function NavigationCtrl($scope, $http, nukeService){
/*$http.get('nukes/nukes.json').success(function(data) {
$scope.nukes = data;
});*/
$scope.nukes = nukeService.getNukes();
}
如果我使用$ http.get来自控制器的数据填充正常,但是,如果我尝试从服务调用数据,我什么也没得到。 据我所知,查询是异步的,但我有一个很难理解如何填充$范围变量一旦返回的数据。 我可以用$ rootscope广播一个事件,并在控制器听它,但是这似乎并不像做到这一点的正确方法。 我真的很感激如何做到这一点的正确方法的任何建议。
我想这应该解决您的问题
app.factory('nukeService', function($rootScope, $http) {
var nukeService = {};
nukeService.data = {};
//Gets the list of nuclear weapons
nukeService.getNukes = function() {
$http.get('nukes/nukes.json')
.success(function(data) {
nukeService.data.nukes = data;
});
return nukeService.data;
};
return nukeService;
});
function NavigationCtrl($scope, $http, nukeService){
$scope.data = nukeService.getNukes();
//then refer to nukes list as `data.nukes`
}
这是对象引用的问题。
当你调用nukeService.getNukes()
你得到一个对象的引用a
那么你的变量$scope.nukes
是指该内存位置。
当您设置远程服务器调用后nukeService.nukes = data;
你是不是改变对象a
,而不是你正在改变nukeService.nukes
从引用对象a
反对b
。 但是,你的$scope.nukes
不知道该重新分配,它仍然指向对象的a
。
我在这种情况下的解决方案是通过一个对象a
与属性data
,然后仅改变数据属性,而不是改变参照a
这应该是如下。 正如NickWiggill的评论中提到,未定义将被分配到nukeService.data如果我们不返回的承诺。
app.factory('nukeService', function($rootScope, $http) {
var nukeService = {};
//Gets the list of nuclear weapons
nukeService.getNukes = function() {
return $http.get('nukes/nukes.json');
};
return nukeService;
});
function NavigationCtrl($scope, $http, nukeService){
nukeService.getNukes().then(function(response){
$scope.data = response.data;
});
}
我要做的就是,我直接从服务公开的数据,并且具有初始化这个数据的方法。 有什么不对呢?
服务:
app.factory('nukeService', function($scope, $http) {
var data = {};
data.nukes = [];
//Gets the list of nuclear weapons
var getNukes = function() {
$http.get('nukes/nukes.json').success(function(data) {
data.nukes = data;
});
};
// Fill the list with actual nukes, async why not.
getNukes();
return {
data : data
// expose more functions or data if you want
};
});
控制器:
function NavigationCtrl($scope, nukeService){
$scope.data = nukeService.data;
//then refer to nukes list as `$scope.data.nukes`
}