2013-06-05 13 views
16

Mam kontroler, który jest zależny od TransactionService. Jedną z metod jestAngularJS: Jak przekazywać wartości z kontrolera do metody serwisowej?

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

TransactionService wygląda

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

Jak widać metody getForMonthAndYear zależy od dwóch parametrów month i year, które są sztywno teraz jako params: {month: 5, year: 2013}. Jak mogę przekazać te dane z kontrolera?

Próbowałem wstrzykiwać rootScope w TransactionService, ale to nie pomogło (co oznacza, że ​​nie wiem jak tego użyć).

Również Angular ngResource documentation nie zaleca żadnego sposobu wykonania tej czynności.

Czy ktoś może tu podać przewodnik?

UPDATE
moim kontroler wygląda

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

i zmienić sposób obsługi do

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

patrzę na console.log i mówi

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

Odpowiedz

5

Definiowanie params w konstruktorze zasobów są konieczne tylko wtedy, gdy rozmowa musi mieć domyślną gdy żaden jest zaopatrywany. Dowolny parametr przekazany do metody jest dołączany jako parametr zapytania, niezależnie od tego, czy ma on zdefiniowaną wartość domyślną. '@' Oznacza, że ​​wartość params zostanie zastąpiona przez wartość zwracaną w odpowiedzi JSON, więc twój @uuid ma sens, ale nie twój @ miesiąc.

Osobiście, chciałbym po prostu stworzyć zasób tak:.

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

Następnie dodać zmienne zapytania, ile potrzeba, przekazując je w (Tworzenie specjalne nazwy metody jest w porządku, ale nie jest to konieczne, tak pokazuje poniższe obie strony.)

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

Myślę, że jego problem nie dotyczy zasobu $, ale raczej interakcji między kontrolerem a usługą – mfeingold

3

One sposób to zrobić jest wstrzykiwać usługę do swojego kontrolera:

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

Następnie można przejść instancję usługi poprzez parametr transactionService.

EDIT

Sprawdź ten fiddle Powiedz mi, czy to jest wystarczająco blisko, aby to, co staramy się robić

+0

Czy możesz mi powiedzieć, jak? Właśnie próbowałem i zaktualizowałem moje pytanie: – daydreamer

+0

@daydreamer: Twoja usługa Transaction funkcjonuje w module o nazwie "transactionServices". Upewnij się, że moduł zdefiniowany przez kontroler określa go jako zależność. angular.module ("myCtrlModule", ['transactionServices']). controller (... – Rao

5

miałem ten sam problem, skończyło się na powrocie parametryzowane funkcje z moich usług, więc obsługa wygląda tak

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

i wywołanie usługi od kontrolera z:

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

Nie jesteś pewien, czy to najczystsze rozwiązanie angular.js, ale działa!

Powiązane problemy