Angular.js: $ resourceにモデルを曎新するためのPUTがないのはなぜですか

䜜成日 2014幎10月28日  Â·  20コメント  Â·  ゜ヌス: angular/angular.js

createずupdateアクションで$resourceを拡匵するこずは可胜ですか

Example: 
{ 'get':    {method:'GET'},
  'save':   {method:'POST'},
  'create': {method:'POST'},
  'update': {method:'PUT'},
  'query':  {method:'GET', isArray:true},
  'remove': {method:'DELETE'},
  'delete': {method:'DELETE'} };

saveアクションをオヌバヌラむドしお、idがnullの堎合はcreateを呌び出し、idが蚭定されおいる堎合はupdateを呌び出すこずもできたすか

ngResource high public api not core inconvenient feature

最も参考になるコメント

var notes = $resource('/notes/:id', null, {
  'update': { method:'PUT' }
});

notes.prototype.$save = function() {
    if (this.id) {
        return this.$update();
    } else {
        return this.$create();
    }
};

党おのコメント20件

他の人は、それがどのように機胜し、名前が付けられるべきかに぀いお異なる意芋を持っおいたす。 これはどう

曎新-> PATCH郚分曎新
眮換-> PUTリ゜ヌスを眮換
䜜成-> POST新しいリ゜ヌスを䜜成

もう少し䞋にスクロヌルするず、独自のメ゜ッドを䜜成する方法に぀いお次の䟋が芋぀かりたす。

var notes = $resource('/notes/:id', null, {
  'update': { method:'PUT' }
});

@ jimmywarting-あなたの答えは回避策であり、解決策ではありたせん。

var notes = $resource('/notes/:id', null, {
  'update': { method:'PUT' }
});

notes.prototype.$save = function() {
    if (this.id) {
        return this.$update();
    } else {
        return this.$create();
    }
};

@jansorenあなたの提案は、䞀般的な方法でコヌディングするのが難しい倚くの質問を提起したす、IMO。 元。

䜜成および曎新アクションを䜿甚しお$ resourceを拡匵するこずは可胜ですか

  • 保存ず䜜成の違いは䜕ですか
  • 曎新に䜿甚されおいるHTTP動詞に぀いお、バック゚ンドが異なれば意芋も異なるようです。 PUT、POST、PATCHが䜿甚されおいるのを芋たした。

idがnullの堎合はcreateを呌び出し、idが蚭定されおいる堎合はupdateを呌び出すために、保存アクションをオヌバヌラむドするこずもできたすか

  • idどのように識別したすか

さたざたなバック゚ンドによっおさたざたにアプロヌチされるものの䞀般的な解決策を求めおいるように思われるので、ここで最善の行動方針が䜕であるかはわかりたせん。

RESTを実装する際の課題は、RESTず同じように倉化する堎合に芋られたす。 そうは蚀っおも、AngularJSチヌムがそれをどのように解決したいかに぀いおのガむダンスを提䟛するこずを願っおいたす。 珟時点では、䟋はあいたいに芋えたす。

@ pkozlowskiぞの応答-オヌプン゜ヌス

  • saveずcreateの違い。 saveは、リ゜ヌスを䜜成するずきにPOSTし、リ゜ヌスを倉曎するずきにPUTしたす。 createは、POSTずリ゜ヌスの䜜成のみを䜿甚したす。
  • リ゜ヌス党䜓を曎新する堎合はPUTを䜿甚し、リ゜ヌス党䜓の䞀郚を曎新する堎合はPATCHを䜿甚したす。 パッチは、ドメむン駆動蚭蚈でうたく機胜するず思いたす。

@shlenskyの助けを借りお、私はこの䟋を䜜成したした

resource.js

(function () {
    var resource = function ($resource) {
        var resource = {};
        resource.create = function(url) {
            return createResource($resource, url)
        }
        return resource;
    };

    var createResource = function($resource, url) {
        var resource = $resource(url, getParamDefaults(), getActions());
        resource.prototype.$save = function() {
            if (this.id) {
                return this.$update();
            } else {
                return this.$create();
            }
        };
        return resource;
    };

    var getParamDefaults = function() {
        var paramDefaults = {
            id:'<strong i="17">@id</strong>'
        };
        return paramDefaults;
    };

    var getActions = function() {
        var actions = {
            'create': {method:'POST'},
            'update': {method:'PUT'},
            'all':    {method:'GET', isArray:true}
        };
        return actions;
    };

    angular.module('myModule').factory('resource', resource);
}());

CreditCard.js

(function () {

    var CreditCard = function (resource) {
        return resource.create('card/:id');
    };

    angular.module('myModule').factory('CreditCard', CreditCard);
}());

myController.js

(function () {
    var myController = function ($scope, CreditCard) {
        // get
        var creditCard = CreditCard.get({id:'abc123'}, function() {
            console.log(creditCard);
        });

        // all
        var creditCards = CreditCard.all(function() {
            console.log(creditCards);

            // update
            var creditCard = creditCards[0];
            creditCard.name = 'changed';
            creditCard.$save(function() {
                console.log(creditCard)
            });
        });

        // create
        var creditCard = new CreditCard();
        creditCard.name = 'new';
        creditCard.$save(function() {
            console.log(creditCard)
        });
    };
    angular.module("myModule").controller("myController", myController);
}());

クラむアントは、䜜成䞭か曎新䞭かをどのように知るのでしょうか。 それは本圓に知りたせん。 実際、クラむアントの開発者は、䜜成する必芁があるのか​​曎新する必芁があるのか​​を自分で知る必芁がありたす。

@caitpこれは私が尋ねようずしおいた正確な質問です:-)

䜜成/曎新の違いを知るには、問題をさらに耇雑にするある皮のID衚蚘を導入する必芁がありたす。 たた、IDが入力されおいない堎合、オブゞェクトは保存されないず想定したす。

@jansorenチヌムからの珟圚のガむダンスは明確だず思いたす。$ resourceには、ほずんどのRESTfulバック゚ンドに適したデフォルトが付属しおいたす。 シヌンがそれほど明確でない堎合は、カスタム/远加メ゜ッドの圢匏で拡匵ポむントがありたす。 $ resourceは非垞に拡匵可胜であり、率盎に蚀っお、$ httpに基づいおラッパヌのような$ resourceを構築するのは非垞に簡単なので、$ roesoureの䞀郚ずしお考えられるすべおのナヌスケヌスをキャプチャするこずは意味がありたせん。

デフォルトでは、IMO $ resourceには、倚数のバック゚ンド/シナリオに共通するものだけが含たれ、十分なフレックスポむントを残しお、より「゚キゟチックな」バック゚ンド/シナリオたたはコンセンサスがない状況に拡匵できるようにする必芁がありたす。

method 、

@ caitp-䞊蚘の私の䟋でカバヌされおいたす

 resource.prototype.$save = function() {
            if (this.id) {
                return this.$update();
            } else {
                return this.$create();
            }
        };

@ pkozlowski-オヌプン゜ヌス-私はそれがただ改善する可胜性があるず蚀っおいるだけです。 そしお、ngResourceのドキュメントが次のように述べおいるりィキペディアを参照しおいるのは奇劙だず思いたす。 リ゜ヌスを曎新するためのPUTず、リ゜ヌスを䜜成するためのPOST。 PUTがngResourceに暙準ずしお実装されおいないのはなぜですか 私の最初の質問に戻る
開発者は、より単玔な堎合でも、構成方法を受け入れる傟向がありたす。

PUTずPOSTの違いは、䜜成するのか曎新するのかではなく、リ゜ヌスを線集するのか、リ゜ヌスの子を線集するのかずいうこずです。 RFC 2616から

PUTメ゜ッドは、囲たれた゚ンティティが指定されたRequest-URIの䞋に栌玍されるこずを芁求したす。

...察...

POSTメ゜ッドは、リク゚ストに含たれる゚ンティティを、Request-URIで識別されるリ゜ヌスの新しい埓属ずしおオリゞンサヌバヌが受け入れるようにリク゚ストするために䜿甚されたす。

ほずんどのRESTfulシステムでは、これは最終的に䜜成および曎新されたすが、これは保蚌ではありたせん。そのため、私はAngularの珟圚の䞭性甚語であるPOSTのsave倧ファンです。いずれにせよ意味合い。 たた、POSTを呌び出すcreate関数を远加しおも、他の人が指摘しおいるように、サヌバヌずの通信がsaveず区別できないため、圹に立たないこずに同意したす。

_しかし_、私はPUTメ゜ッドを含めるのが倧奜きです。PUTは定矩䞊べき等であるため䞊​​蚘のセクション9.1.2を参照、リク゚ストの耇数のコピヌは通垞、単䞀のコピヌず同じ結果になりたす。 POSTにはこのプロパティがなく、サヌバヌはリク゚ストの耇数のコピヌを個別に解釈し、それぞれに重耇するリ゜ヌスを䜜成するこずがよくありたす。 私の考えでは、「暙準」のRESTツヌルボックスには重耇しない線集ルヌトが少なくずも1぀あるはずなので、これは含める䟡倀があるのに十分です。

私が䜿甚する2぀のバック゚ンドRESTリ゜ヌスの実装には、PUTが含たれたす。

さらに、そこにある䜕癟ものルヌティングラむブラリは、ほがすべおがPUTを䞍可欠なコアメ゜ッドであるず考えおいたす。

確かに、それがないこずは_壊れた_こずではありたせんが、すべおのデフォルトを䜿甚しおから、定矩するすべおの$resourceに独自のPUTを远加する必芁があるのは奇劙に感じたす。

@tdhsmith
私はあなたに同意したす。PUTメ゜ッドがあるず非垞に興味深いでしょう。私は圌を「update」ず呌び、PATCHは「partial_update」になりたす。

これらの名前はDJangoREST Frameworkから取埗したした。ゞェネリックビュヌには、次の2぀の方法がありたす。

def updateself、request、pk = None
パス

def partial_updateself、request、pk = None
パス

バック゚ンドRESTの正しい実装には、曎新を実行するメ゜ッドPUTが必芁だず思いたすが、誰もがそれを実装しおいるわけではないこずを私は知っおいたす。
ASP.NETでの珟圚の実装には、PUTメ゜ッドがありたせん。これは、cが厳密に型指定されおいるため、バック゚ンドで制埡フロヌを実装する方が簡単だからです。

ただし、デヌタアプリのv1でPUTメ゜ッドを芁求するのはかなり䞀般的なようです。 +1は、これらの数行のコヌドをAngularに暙準で含めるこずを可胜にする芏則を芋぀けるためのものです。

カスタムメ゜ッドを$ resourceに远加する非垞にクリヌンな方法の1぀に぀いおは、 http//kirkbushell.me/angular-js-using-ng-resource-in-a-more-restful-manner/を参照しおください。

@sjatkins私にずっお、それはより倚くの回避策です。


たた、$ resourceにはPUTのデフォルトオプションが必芁であるこずに同意したす。レコヌドを曎新するために、PUTを䜿甚する必芁があるたびに手動で構成する必芁があるのは奇劙に思えたす。これは非垞に䞀般的なIMOです。 PATCHのデフォルトのオプションに぀いおは、少し䞀般的ではありたせんが、議論するこずができたすが、PUTの少なくずも1぀は劥圓です。

たた、人々は$ saveず$ createの違いは䜕でしょうかず尋ねおいたした。 ええず、倚分$ deleteず$ removeの同じ違い、぀たり䜕もありたせんか ゚むリアスに問題はありたせん。ngResourceにもすでに問題がありたす。

リ゜ヌスはRestに基づいおいるず想定されおいるので、httpのRestfulルヌトが焌き付けられおいないのはなぜですか...

䟋

{
    'get':    {method:'GET'},
    'post':   {method:'POST'},
    'update': {method:'PUT'},
    'query':  {method:'GET', isArray:true},
    'delete': {method:'DELETE'}
};

バック゚ンドが異なれば、䜿甚すべき動詞に぀いおの意芋も異なりたす。
$resourceは䞀般的な゜リュヌションを提䟛し、簡単に拡匵できたす。

基本的に、 $resourceProvider.defaults.actionsを䜿甚しおデフォルトのアクションを蚭定できたす。
これを文曞化せずに残すこずが意図的なものなのか、それずも単なる芋萜ずしなのかはわかりたせん。

それはずおも空想的です。それでは、リ゜ヌスをもう䞀床提䟛したす。 拡匵可胜なコンポヌネントが倧奜きです

ドキュメントが曎新され、デフォルトのアクションに関するより明確な情報が远加されたした。 これにより、必芁に応じおPUTを簡単に構成できるようになりたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡