2013-06-05 15 views
16

Ho un controller che dipende da TransactionService. Uno dei metodi èAngularJS: come passare valori dal metodo Controller a servizio?

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

Il TransactionService sembra

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

Come si può vedere il metodo getForMonthAndYear dipende da due parametri month e year, che sono fissi in questo momento come params: {month: 5, year: 2013}. Come posso trasferire questi dati dal mio controller?

Ho provato a iniettare rootScope in TransactionService, ma ciò non ha aiutato (nel senso che non so come usarlo probabilmente).

Anche Angular ngResource documentation non consiglia alcun metodo per eseguire questa operazione.

Qualcuno può guidare qui?

UPDATE
mio controller sembra

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

e cambiare metodo di servizio ai

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

guardo il console.log e dice

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

risposta

5

Definizione params nel costruttore di risorse sono necessarie solo quando la chiamata deve avere un valore predefinito quando nessuno è fornito. Qualsiasi parametro passato al metodo viene aggiunto come parametro di query, indipendentemente dal fatto che abbia un valore predefinito definito. "@" Significa che il valore params viene sostituito da ciò che viene restituito nella risposta JSON, quindi il tuo @uuid ha senso, ma non il tuo @month.

Personalmente, vorrei solo creare la risorsa in questo modo:.

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

Quindi aggiungere le variabili di query in base alle esigenze da loro passando (Creazione di nomi dei metodi speciali è bene, ma non è necessario in modo che mostra entrambi i modi di seguito.)

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 
+0

Penso che il suo problema non sia con la risorsa $, ma piuttosto l'interazione tra il controller e un servizio – mfeingold

3

One modo di farlo è quello di iniettare il servizio nel controller:

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

Quindi è possibile accedere a un'istanza del servizio attraverso il parametro transactionService.

EDIT

check-out questa fiddle Dimmi se questo è abbastanza vicino a quello che si sta tentando di fare

+0

Puoi dirmi come? Ho appena provato e aggiornato la mia domanda – daydreamer

+0

@daydreamer: il tuo servizio Transaction risiede in un modulo chiamato "transactionServices". Assicurarsi che il modulo in cui è definito il controller specifichi come dipendenza. angular.module ('myCtrlModule', ['transactionServices']). controller (... – Rao

5

Ho avuto lo stesso problema, ho finito per tornare funzioni parametrizzate dal mio servizio, quindi il servizio sembra che

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

e chiamando il servizio dal controllore con:

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

non sicuro che questa sia la soluzione angular.js più pulita, ma funziona!

Problemi correlati