AngularJS: Как передать значения от контроллера к методу обслуживания? - программирование
Подтвердить что ты не робот

AngularJS: Как передать значения от контроллера к методу обслуживания?

У меня есть контроллер, который зависит от TransactionService. Один из методов -

$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 выглядит как

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

Как вы можете видеть, метод getForMonthAndYear зависит от двух параметров month и year, которые теперь жестко запрограммированы как params: {month: 5, year: 2013}. Как передать данные с моего контроллера?

Я попробовал вставить rootScope в TransactionService, но это не помогло (это означает, что я не знаю, как его использовать).

Кроме того, Angular документация ngResource не рекомендует никакого способа выполнить это.

Может ли кто-нибудь обратиться сюда?

UPDATE
Мой контроллер выглядит как

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

и я меняю метод службы на

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

Я смотрю на console.log, и он говорит

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

Ответ 1

Определение параметров в конструкторе ресурса необходимо только тогда, когда для вызова необходимо иметь значение по умолчанию, когда ни один из них не указан. Любой параметр, переданный методу, добавляется как параметр запроса, независимо от того, задано ли значение по умолчанию. Значение "@" означает, что значение params заменяется на то, что возвращается в ответ JSON, поэтому ваш @uuid имеет смысл, но не ваш @month.

Лично я бы просто создал ресурс следующим образом:

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

Затем добавьте переменные запроса по мере необходимости, передав их. (Создание специальных имен методов отлично, но не обязательно, поэтому показано оба способа ниже.)

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

Ответ 2

У меня была такая же проблема, я закончил возвращать параметризованные функции из моей службы, поэтому служба выглядит так:

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

и вызов службы с контроллера:

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

не уверен, что это самое чистое решение angular.js, но оно работает!

Ответ 3

Один из способов сделать это - ввести службу в ваш контроллер:

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

Затем вы можете получить доступ к экземпляру своей службы через параметр transactionService.

ИЗМЕНИТЬ

ознакомьтесь с этим fiddle Скажите, если это достаточно близко к тому, что вы пытаетесь сделать