2013-03-01 117 views
1

我正在开发一个小的AngularJS应用程序,我目前正在努力创建服务。JSON初始化服务中的数据

我有一个服务作为提供联系人(名称,地址...)的后端。 到现在为止,他们硬编码在服务(instance.contacts=[...])数组,但现在我想从一个JSON文件阅读:

myModule.factory('contactService', ['$http',function ($http) { 
    var instance = {}; 

    $http.get('contacts.json').success(function (data) { 
     instance.contacts = data; 
    }); 

    return instance; 
}]); 

我在该文件还有我的浏览器控制台中看到已被成功读取,但我在屏幕上看不到任何更改。

所以我尝试了以下,而不是和它的工作:

myModule.factory('contactService', ['$http',function ($http) { 
    var instance = { 
     contacts:[] 
    }; 

    $http.get('contacts.json').success(function (data) { 
     angular.forEach(data, function(item) { 
      instance.contacts.push(item); 
     }); 
    }); 

    return instance; 
}]); 

我不知道为什么第二代码片段的作品,而不是第一个。有人能帮我理解吗?

+1

你能告诉我们其余的代码吗?你在哪里访问它? '$ http'返回一个承诺,但我没有看到你的服务返回*任何*。 – 2013-03-01 18:03:50

+0

对不起,这只是一个片段,我无意中删除了“返回实例”部分。我会放回去。 – 2013-03-01 18:05:58

+0

'return instance'实际上是什么被打破。看到我的答案。 – 2013-03-01 18:18:55

回答

4

$http是异步的,所以你不能返回数组,因为当你返回它时,它可能还没有任何数据。实际上,你必须退回承诺:

var instance = $http('contacts.json'); 

return instance; 

然后在你的控制器(或其他服务):

contactService.then(function(response) { 
    $scope.contacts = response.data; 
}); 

只要记住,无论你在哪里访问你的服务,你必须与它互动作为承诺使用then

+0

好吧,我想我只是在通用服务和'$ http'访问之间进行分割...... – 2013-03-02 11:47:00

0

您可能会更好使用ngResource关闭,在这种情况下,你的代码应该是这个样子:

myModule.factory('contactService', function ($resource) { 
    return $resource('contacts.json', {}, { 
     get: {method: 'GET', isArray: true} 
    }); 
}) 

确保Mymodule中在其依赖的列表中有ngResource。然后在您的控制器中,您可以使用contactService.get()

+0

如果服务器端API不稳定,我建议不要使用ngResource,它会导致很多麻烦。但如果是这样,那太棒了! – 2013-03-01 18:13:39

+0

的确,我只是假设现在一切都是RESTful! – jgm 2013-03-01 18:14:28

+0

我无法直接返回$资源,因为我的服务有其他方法(saveContact(),getContactById()等)。我的目标是预先加载一个数组中的数据集,没有更多 - 我没有一个宁静的服务器(还)。 – 2013-03-01 18:21:48