TransactionService
に依存するコントローラがあります。方法の1つは
$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
は、現在params: {month: 5, year: 2013}
としてハードコーディングされている2つのパラメーターmonth
とyear
に依存しています。コントローラからこのデータをどのように渡すことができますか?
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
リソースコンストラクターでパラメーターを定義する必要があるのは、何も指定されていないときに呼び出しにデフォルトを設定する必要がある場合のみです。メソッドに渡されたすべてのパラメータは、デフォルト値が定義されているかどうかに関係なく、クエリパラメータとして追加されます。 「@」は、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
同じ問題があり、サービスからパラメーター化された関数を返すことになりました。そのため、サービスは次のようになります。
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ソリューションであるかどうかはわかりませんが、動作します!
これを行う1つの方法は、コントローラーにサービスを注入することです。
angular.controller('controllerName',
['$scope', 'Transaction',
function($scope, transactionService) {
...
}
]);
その後、transactionServiceパラメータを使用してサービスのインスタンスにアクセスできます。
編集
これをチェックしてください fiddle これがあなたがやろうとしていることに十分近いかどうか教えてください