web-dev-qa-db-fra.com

AngularJS: Comment passer des valeurs du contrôleur à la méthode de service?

J'ai un contrôleur qui dépend d'un TransactionService. L'une des méthodes est

$scope.thisMonthTransactions = function () {
    $scope.resetTransactions();
    var today = new Date();
    $scope.month = (today.getMonth() + 1).toString();
    $scope.year = today.getFullYear().toString();
    $scope.transactions = Transaction.getForMonthAndYear();
};

Le TransactionService ressemble à

angular.module('transactionServices', ['ngResource']).factory('Transaction', function ($resource, $rootScope) {
    return $resource('/users/:userId/transactions/:transactionId',
        // todo: default user for now, change it
        {userId: 'bd675d42-aa9b-11e2-9d27-b88d1205c810', transactionId: '@uuid'},
        {
            getRecent: {method: 'GET', params: {recent: true}, isArray: true},
            getForMonthAndYear: {method: 'GET', params: {month: 5, year: 2013}, isArray: true}
        });
});

Comme vous pouvez le voir, la méthode getForMonthAndYear dépend de deux paramètres month et year, qui sont codés en dur en ce moment comme params: {month: 5, year: 2013}. Comment puis-je transmettre ces données à partir de mon contrôleur?

J'ai essayé d'injecter rootScope dans TransactionService, mais cela n'a pas aidé (ce qui signifie que je ne sais pas comment l'utiliser probablement).

Aussi documentation Angular ngResource ne recommande aucun moyen d'effectuer cela.

Quelqu'un peut-il vous guider ici?

[~ # ~] mise à jour [~ # ~]
Mon contrôleur ressemble à

function TransactionsManagerController($scope, Transaction) {

    $scope.thisMonthTransactions = function () {
        $scope.resetTransactions();
        var today = new Date();
        $scope.month = (today.getMonth() + 1).toString();
        $scope.year = today.getFullYear().toString();

        var t = new Transaction();
        $scope.transactions = t.getForMonthAndYear({month: $scope.month});
    };
}

et je change la méthode de service en

getForMonthAndYear: {method: 'GET', params: {month: @month, year: 2013}, isArray: true}

Je regarde le console.log et ça dit

Uncaught SyntaxError: Unexpected token ILLEGAL transaction.js:11
Uncaught Error: No module: transactionServices 
16
daydreamer

La définition de paramètres dans le constructeur de ressources n'est nécessaire que lorsque l'appel doit avoir une valeur par défaut lorsqu'aucun n'est fourni. Tout paramètre transmis à la méthode est ajouté en tant que paramètre de requête, qu'il ait ou non une valeur par défaut définie. Le '@' signifie que la valeur de params est remplacée par ce qui est retourné dans la réponse JSON, donc votre @uuid est logique, mais pas votre @month.

Personnellement, je créerais simplement la ressource comme ceci:

$resource('/users/:userId/transactions/:transactionId',
    // todo: default user for now, change it
    {userId: 'bd675d42-aa9b-11e2-9d27-b88d1205c810', transactionId: '@uuid'},
    {
        getRecent: {method: 'GET', params: {recent: true}, isArray: true},
        getForMonthAndYear: {method: 'GET', isArray: true}
    });

Ajoutez ensuite les variables de requête selon vos besoins en les transmettant. (La création de noms de méthodes spéciales est correcte mais pas nécessaire, donc affichez les deux façons ci-dessous.)

var t = new Transaction();
$scope.recentTransactions = t.$get({recent:true}) //results in /users/bd675d42-aa9b-11e2-9d27-b88d1205c810/transactions/?recent=true
$scope.recentTransactions = t.$getRecent(); //same thing as above
$scope.transactions = t.$get({month: $scope.month, year: $scope.year}); //results in /users/bd675d42-aa9b-11e2-9d27-b88d1205c810/transactions/?month=5&year=2013
$scope.transactions = t.$getForMonthAndYear({month: $scope.month, year: $scope.year}); //same as above... since no defaults in constructor, always pass in the params needed
5
Lukus

J'ai eu le même problème, j'ai fini par renvoyer des fonctions paramétrées de mon service, donc le service ressemble à ça

factory('MyService', function($resource) {
    return {
        id: function(param) { return $resource('/api/'+param+'/:id', {id: '@id'}); },
        list: function(param) { return $resource('/api/'+param); },
        meta: function(param) { return $resource('/api/meta/'+param); }
    }
})

et appeler le service depuis le contrôleur avec:

$scope.meta = MyService.meta('url_param').query();

pas sûr que ce soit la solution angular.js la plus propre, mais ça marche!

5
gru

Une façon de le faire est d'injecter le service dans votre contrôleur:

angular.controller('controllerName', 
 ['$scope', 'Transaction',
   function($scope, transactionService) {
      ...
   }
]);

Ensuite, vous pouvez accéder à une instance de votre service via le paramètre transactionService.

ÉDITER

vérifiez ceci violon Dites-moi si cela est assez proche de ce que vous essayez de faire

3
mfeingold