2012-04-06 7 views
7

Mam następującą funkcję, którą chciałbym przekonwertować na usługę.Konwersja funkcji AngularJS do usługi

Jak mógłbym wydobyć $ resource call do usługi AngularJS i jak nazwałbym tę usługę?

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; 
    }); 
} 

Dzięki!

Odpowiedz

18

Podejrzewam, że pracujesz w wersji 0.9.19. Po pierwsze sugeruję przejście do wersji 1.0rc4. Wersja 1.0 jest bliska uruchomienia i jest stabilna, ale ma wiele przełomowych zmian w stosunku do wersji 0.9. Możesz zobaczyć Angular documentation, aby uzyskać więcej informacji.

W wersji 1.0 zawijacie wszystko w module: kontrolery, usługi, dyrektywy i tak dalej. Utwórz moduł tak:

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

W wersji 1.0 usług zasób jest uwzględnione na zewnątrz do własnej klasy, więc trzeba dać go jako zależność. Będziesz także musiał dołączyć plik resource js do swojej aplikacji.

Teraz, aby utworzyć usługę, możesz po prostu użyć modułu API. W takim przypadku:

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

Należy zauważyć, że zależność od zasobu $ jest wprowadzana kątowo.

Osobiście nie podoba mi się bałagan z zakresem wewnątrz mojej służbie więc chciałbym mieć następujące w moim kontrolera:

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

Zauważ, że w wersji 1.0 zakres jest także wstrzykiwane do sterownika tak nie używać już siebie. Uznałem również, że mogę wybrać, że wybrany element będzie zawierał tylko pola od gracza, więc właśnie napisałem gracza prosto nad wybranym graczem. Możesz także zrobić to ręcznie pole lub użyć angular.extend($scope.selectedPlayer, player); do scalenia dwóch obiektów. Jest to skrzypce: 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(....); 
    } 
} 
Powiązane problemy