Wie werden benutzerdefinierte AngularJS $ -Ressourcenaktionen verwendet?

8

Ich habe benutzerdefinierte Aktionen in einigen Repositorys verwendet. Und bisher musste ich nur die URL und die Methode angeben.

Zum Beispiel:

%Vor%

Aber dann musste ich eine benutzerdefinierte Aktion programmieren, die nicht einen, sondern zwei Pfadparameter hatte:

%Vor%

Also habe ich es zuerst wie folgt codiert:

%Vor%

Aber es würde nicht funktionieren. Die Parameter wurden nicht übergeben.

Nach ein paar Versuchen habe ich herausgefunden, dass es funktionierte, als ich eine Parameterdefinition direkt vor der benutzerdefinierten Aktionsdefinition hinzufügte.

Es musste wie sein:

%Vor%

Beachten Sie das Vorhandensein von:

%Vor%

Mein Verständnis war dann, dass in einer $ -Ressourcendefinition eine benutzerdefinierte Aktion, die mehr als einen Pfadparameter hat, erfordert, dass sie mit @ -Zeichen definiert werden.

Und nicht wenn es nur eins gibt.

Warum ist das so?

Und warum können die Pfadparameter nicht in der benutzerdefinierten Aktion anstelle von oben in der Ressource deklariert werden?

    
Stephane 19.09.2014, 07:36
quelle

2 Antworten

23

Die Parameter können als benutzerdefinierte Aktion deklariert werden.
Die Standardparameter sind, was ihr Name impliziert: Standardparameter (wie in: "Wird verwendet, falls keine anderen Parameter bereitgestellt werden").

Die Verwendung von '@' (entweder in Standardparametern oder in Aktionsparametern) ist nicht obligatorisch.
Es ist als Bequemlichkeit vorgesehen und hat eine besondere Bedeutung. paramKey: '@someProp' bedeutet:
"Für Methoden, die einen Anfragetext haben (zB POST, PUT usw.), wenn ich nicht explizit einen Wert für den Parameter paramKey zur Verfügung stelle, schauen Sie bitte in mein Datenobjekt nach einem Eigenschaft namens someProp und verwenden Sie ihren Wert als Wert für den Parameter paramKey . "

Beachten Sie, dass Sie bei Verwendung einer Klassenmethode das Datenobjekt explizit angeben müssen:

%Vor%

Wenn Sie eine Instanzmethode verwenden, fungiert die Instanz selbst als Datenobjekt:

%Vor%

Sehen Sie auch diese kurze Demo .

UPDATE:

Sie möchten die folgende benutzerdefinierte Aktion aufrufen:

%Vor%

Versuchen Sie es so zu nennen <ResourceClass>.add({teamId: teamId, technicianId: technicianId}) funktioniert nicht wie erwartet, da es das (beabsichtigte) params-Objekt als Datenobjekt interpretiert.

Aus der ngResource -Dokumentation sind die Methodensignaturen für "non-GET" -Methoden (wie Ihre):

  • non-GET "class" Aktionen: Resource.action ([Parameter], PostData, [Erfolg], [Fehler])
  • non-GET-Instanzaktionen: instance. $ action ([Parameter], [Erfolg], [Fehler])

Aus dem obigen Beispiel ist klar, dass wenn Sie nur ein Objekt in einem "Klassen" -Aktionsaufruf übergeben, dann wird es als data -Objekt interpretiert (Nutzlast der Anfrage). Außerdem, wenn Sie @ -prefixed Standard-Parameter haben, werden die URL-Parameter gegen das data -Objekt aufgelöst (deshalb funktionierte es mit Standard-Parametern).

Damit Angular das params -Objekt als params (und nicht data -Objekt) interpretiert und der data -Param obligatorisch ist, müssen Sie ihn wie folgt aufrufen:

%Vor%

(Alternativ könnten Sie eine TeamTechnician -Instanz verwenden, aber das ist eine andere Geschichte.)

    
gkalpak 19.09.2014, 09:40
quelle
3

Wenn Sie eine $ -Ressource definieren, sieht die Definition so aus

$resource(url, [paramDefaults], [actions]);

Der zweite Parameter paramDefaults dient nur dazu, Standardwerte zur Verfügung zu stellen. Die Syntax @ wird verwendet, um den Parameterwert aus der Nutzlast einer PUT- oder POST-Anforderung abzuleiten.

Sie können immer Parameterwerte angeben, während Sie die Ressourcenaktion tatsächlich aufrufen. Wenn Sie dies nicht tun, werden die Standardparameterwerte übernommen, und wenn auch diese nicht vorhanden sind, wird das Fragment entfernt.

Was parametrisiert werden kann, muss für $ resource mit der : -Syntax definiert werden und dasselbe gilt für den Standardwert. Für die Aktionsmethode nehmen sie nur das gleiche $http config -Objekt.

    
Chandermani 19.09.2014 08:09
quelle

Tags und Links