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
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
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!
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