2013-08-16 46 views
1

我想做一個函數,從ajax URL獲取一些信息。例如,在我的服務,我想有以下方法:在AngularJS中,如何自動更新通過ajax獲取的值?

this.getFavColor = function(id) 
{ 
    return $http.get('/colors/get/' + id); 
} 

而在我的控制,我會做到以下幾點:

$scope.favColor = UserService.getFavColor(id); 

問題不過是,$scope.favColor將在本指派一個承諾情況下,實際將其更改爲由ajax返回的值的唯一方法是在承諾上設置一個.success()回調並使用它來更新該值。

但是,如果我有許多必須通過ajax獲取的東西,這很快就變得很麻煩。有沒有捷徑可以做到這一點?

this.getFavColor = function(id, variableToChange) 
{ 
    return $http.get('/colors/get/' + id).success(function(jsonResult) 
     { 
     variableToChange = jsonResult.favColor; 
     }); 
} 

,然後做在控制器中的以下內容:

UserService.getFavColor(id, $scope.favColor); 

請問這個方法真的有效麼?

注意:我已經考慮過$resource但我無法爲我的ajax設置REST API,因此請不要建議它。

+0

這應該有效。你試過了嗎?我唯一的疑問是因爲return語句不直接返回promise,而是調用success方法。如果成功也回報承諾就沒問題。否則,你不需要返回任何東西,或者先將承諾帶入變量,然後調用成功,並返回承諾。 – Chandermani

+0

@Chandermani我還沒有嘗試過,但我更願意使用'$ resource'用來做這件事的任何方法。你有沒有看過'angular.resource.js'的代碼,你能弄清楚它是如何做到這一點的? –

+0

你不需要一個REST API來使用'$ resource'獲取數據。只要數據是json GET就可以毫無問題地工作。它只需要一個url來獲取數據。 – Chandermani

回答

2

$ resource的做法是立即返回一個空對象,然後在響應從服務器到達時向此對象添加數據。這就是爲什麼$ resource只能返回對象或數組,而不是原語。

ng-bind(和簡寫{{}})實際上解決了承諾,所以這可能是更好的解決方案。我用三個不同的例子創建了一個plnkr:http://plnkr.co/edit/WOrU5eMOmsgK4wuiSCHu?p=preview

// data.json: {"color":"Blue"} 

app.service('UserService',function($http, $q){ 
    return { 

    // return value can be accessed by {{value.data.color}} 
    getFavColor: function(id){ 
     return $http.get('data.json'); 
    }, 

    // return value can be accessed by {{value}} 
    getFavColorWithQ: function(id){ 
     var def = $q.defer(); 
     $http.get('data.json').success(function(data){ 
     def.resolve(data.color); 
     }); 
     return def.promise; 
    } 

    // return value can be accessed by {{value.color}} 
    ,resourceExample: function(id){ 
     var response = {}; 
     $http.get('data.json').success(function(data){ 
     response.color = data.color; 
     }); 
     return response; 
    } 
    } 
}); 
+0

對我來說,第三個選項似乎並沒有更新看來,它似乎並沒有觸發angularjs的手錶。 '$ scope。$ apply'可能是需要的,但是對於我來說,我會得到'摘要已經在進行'的消息。第二種方法可以很好地工作。 –

+0

第一種方法只會返回承諾,您必須使用'success'回調,對吧? –

+1

你有沒有看到我的plnkr例子?它顯示了所有方法的工作方式,您不必在任何方法中使用回調方法。但是第一個和第二個例子都返回promise,這只是第一個例子返回一個響應對象的承諾,第二個例子返回一個值爲 – joakimbl