2013-03-01 115 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