2012-04-06 30 views
7

我有以下要轉換爲服務的函數。將AngularJS函數轉換爲服務

我該如何將$ resource調用解壓到AngularJS服務中,以及如何調用此服務?

self.select = function (email) { 
    var Player = $resource('/player/get',{email:email}); 
    var player = Player.get(function() { 
     self.selectedPlayer.email = player.email; 
     self.selectedPlayer.fuel = player.fuel; 
     self.selectedPlayer.cargo = player.cargo; 
     self.selectedPlayer.food = player.food; 
    }); 
} 

謝謝!

回答

18

我懷疑你的版本是0.9.19。我首先建議你移到版本1.0rc4。 1.0版本即將上線並且穩定,但它在0.9版本上有很多重大改變。您可以看到Angular documentation瞭解更多信息。

在v1.0中,您將所有內容都包含在模塊中:控制器,服務,指令等等。創建一個模塊,像這樣:

var module = angular.module('ModuleName', ['ngResource']); 

在1.0版本的資源服務分解出來爲自己的類,所以你必須給它作爲一個依賴。您還必須在您的應用中包含resource js文件。

現在創建一個服務,您可以簡單地使用模塊API。在這種情況下:

module.factory('Player', ['$resource', function($resource) { 
    return $resource('/player/get');}]); 

請注意,對$ resource的依賴性是通過角度注入的。

我個人不喜歡惹我的服務裏面的範圍,所以我有我的控制器內的以下內容:

module.controller('MyController', ['$scope', 'Player', function($scope, Player) { 
    $scope.select = function(email) { 
     console.log("selecting"); 
     Player.get({ 
     email: email 
     }, function(player) { 
      $scope.selectedPlayer = player; 
     }); 
    }; 
}]);​ 

注意,在1.0的範圍也被注入到控制器,以便不再使用自己。另外,我冒昧地假設selectedPlayer只包含來自播放器的字段,所以我只是將播放器直接寫入selectedPlayer的頂部。您也可以手動逐場進行,或者使用angular.extend($scope.selectedPlayer, player);合併兩個對象。

這裏是小提琴:http://jsfiddle.net/DukvU/

11
angular.module('myModule', []). 
    factory('Player', function($resource) { 
    return $resource('/player/get',{email:email}); 
    }); 

function MyController($scope, Player) { 
    $scope.select = function(email) { 
    Player.get(....); 
    } 
}