2017-01-20 6 views
2

バックエンドサーバに送信されたパラメータをネストしたいとします。これまでのところ、私の現在のリソースは、私のバックエンドサーバに送信されngResourceでパラメータをネストする

var user = new User({name: 'jason', email: '[email protected]'}); 
user.$save() 

paramsが理想的

{name: 'jason', email: '[email protected]'} 

のように見える終わる...私のコントローラで

angular 
    .module('myApp.users') 
    .factory('User', user); 

    user.$inject = ['$resource']; 

    function user($resource) { 
    return $resource('/users.json'); 
    } 

のように見える、私が欲しいですバックエンドサーバに送信されたパラメータは、

{user: {name: 'jason', email: '[email protected]'}} 

私はコントローラに私が

var user = new User({user: {name: 'jason', email: '[email protected]'}}); 

を書くことができることを知っているしかし、私はそのアプローチが好きではありません。私が知りたいのは、コントローラ内ではなくユーザリソースにネストされたパラメータを作成する方法があることです。 paramsDefault引数がここで助けてもいいですか?公式ドキュメントによると、あなたはtransformRequestプロパティを使用して、/マップの入力データをラップすることができるはず

+0

[こちら](http://stackoverflow.com/questions/34744611/angularjs-transform-data-before-send-with-ng-resource-and-transformrequest)の投稿をチェックしてください。トランスフォームリクエストを使用してみてください。そして、[ここ](https://docs.angularjs.org/api/ng/service/$http)は、これについての公式な文書です – Michael

+0

私はこれを調べます。つまり、私は$リソースオブジェクトの簡潔さを本当に楽しみます: 'return $ resource( '/ users.json');'。更新や作成など、さまざまなリソースアクションを手動で作成する必要がなくても、私の仕事は恒星となるでしょう。 – jason328

+0

サービスの利用はどうですか?あなたはそれを考えましたか? –

答えて

0

:だけでなく、この質問と回答を参照してください

function user($resource) { 
    var actions = { 
    transformRequest: function(data, headersGetter){ 
     return { 
     user: data 
     } 
    } 
    } 
    return $resource('/users.json',{},actions) 
} 

https://docs.angularjs.org/api/ngResource/service/$resource

は、次のコードを試してみてください類似の解を説明する:Angularjs: Transform data before send with ng-resource and transformRequest

+0

私のドキュメントの解釈は、特定のアクションに対してのみtransformRequesを適用できることを示しています。たとえば、あなたが提供したSOの質問では、彼らは更新アクションの中でtransformRequestを持っていました。それはまさに私が避けようとしていることです。 – jason328

0

ユーザコンストラクタ関数にプロトタイプメソッドを追加することができます

app.factory('User', function ($resource) { 
     var User = $resource('/users.json'); 

     // add custom method below 
     User.prototype.getSpecificUser = function() { 
      return new User({user: {name: 'jason', email: '[email protected]'}}); 
     }; 
     return User; 
    }); 
コントローラ内で

User.getSpecificUser() 
+0

私は、新しい工場を作ることによって過度に複雑にすることを好まないでしょう。 – jason328

0

あなたは$resourceのための単純なラッパーを書くことについてどう思いますか?私はan example plnkrを設定している:

angular 
    .module('myApp.users') 
    .factory('User', user); 

    user.$inject = ['myResource']; 

    function user(myResource) { 
    return myResource('user', '/users.json'); 
    } 
:次に、実際の工場は次のようになり

app.factory('myResource', function($resource) { 
    return function(namespace, url, paramDefaults, actions, options) { 
    var transformRequest = function(data) { 
     var payload = {}; 
     payload[namespace] = data; 
     console.log(payload); 
     return data; 
    } 

    // ngResource default actions: https://github.com/angular/angular.js/blob/master/src/ngResource/resource.js#L510 
    actions = actions || { 
     'get': {method: 'GET'}, 
     'save': {method: 'POST'}, 
     'query': {method: 'GET', isArray: true}, 
     'remove': {method: 'DELETE'}, 
     'delete': {method: 'DELETE'} 
    }; 
    Object.keys(actions).map(function(action){ 
     actions[action].transformRequest = transformRequest; 
    }); 

    return $resource(url, paramDefaults, actions, options) 
    }; 
}); 

アイデアはラッパーに必要な名前空間を通過した後、ちょうどtransformRequest機能と、各アクションを拡張することです

関連する問題