我有一个依赖于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 documentation不建议采用任何方式执行此操作。
有人可以在这里指导吗?
更新
我的控制器看起来像
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
答案 0 :(得分:5)
仅当调用需要在没有提供时才需要默认值时,才需要在资源构造函数中定义params。无论是否定义了默认值,传入方法的任何参数都将作为查询参数附加。 '@'表示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
答案 1 :(得分: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解决方案,但它确实有用!
答案 2 :(得分:3)
这样做的一种方法是将服务注入您的控制器:
angular.controller('controllerName',
['$scope', 'Transaction',
function($scope, transactionService) {
...
}
]);
然后,您可以通过transactionService参数访问服务实例。
修改
看看这个fiddle告诉我这是否足够接近你想要做的事情