2013-06-05 181 views
16

我有一個依賴於TransactionService的控制器。其中一個方法是AngularJS:如何將值從控制器傳遞到服務方法?

$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取決於方法兩個參數monthyear,這是硬編碼,現在爲params: {month: 5, year: 2013}。我如何從我的控制器傳遞這些數據?

我試過rootScope注入TransactionService,但這並沒有幫助(這意味着我不知道如何使用它可能)。

另外Angular ngResource documentation不建議任何方式來執行此操作。

有人可以在這裏指導嗎?

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 

回答

5

在資源構造函數定義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 
+0

我認爲他的問題不是與$資源,而是控制器和服務之間的交互 – mfeingold

3

一這樣做的方式是注入的服務爲您的控制器:

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

然後你就可以通過transactionService參數訪問服務的一個實例。

編輯

檢查出這個fiddle告訴我,這是足夠接近你正在嘗試做

+0

你能告訴我怎麼樣?我剛剛嘗試並更新了我的問題 – daydreamer

+0

@daydreamer:您的交易服務位於名爲「transactionServices」的模塊中。確保您的控制器在其中定義的模塊將其指定爲其依賴項。 angular.module('myCtrlModule',['transactionServices'])。控制器(... – Rao

5

我有同樣的問題,我結束了從我的服務返回的參數化功能,使服務看起來像

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解決方案,但它的工作原理!

相關問題