Ab Seite 141 von Im Lightning Components Developer Guide werden die gültigen Typen aufgelistet für Auraattribute. Apex-Klassen und -Sammlungen sind enthalten, daher habe ich eine Apex-Controller-Methode geschrieben, um eine Sammlung von Apex-Klassenobjekten zurückzugeben, die später in einem Attribut gespeichert werden sollen.
Aber wenn ich die Ergebnisse des Aufrufs meiner Methode schreibe In der Javascript-Konsole wird ein einzelnes Elementarray angezeigt, und das Element hat keine anderen Eigenschaften als __proto__. Ich habe gesehen, dass dies bei Sammlungen von Grundelementen und SObjects korrekt funktioniert.
Werden Apex-Klassen als Rückgabe nicht unterstützt? Art? Ich weiß, dass meine @ AuraEnabled-Methode ordnungsgemäß funktioniert, und mein Aktionsrückruf schreibt einfach den Inhalt von action.getReturnValue () in die Konsole.
Antwort
Eine zu überprüfende Sache ist, dass die Zugriffsmethoden für alle in der Antwort enthaltenen Objekte die Annotation @AuraEnabled enthalten. Das Folgende hat mich beispielsweise kürzlich beim Anpassen des Beispielcodes für eine Lightning-Anwendung gestolpert:
@AuraEnabled public static List<SelectOption> getPuzzleTypes() { List<SelectOption> options = new List<SelectOption>(); Schema.DescribeFieldResult fieldResult = Puzzle__c.Type__c.getDescribe(); List<Schema.PicklistEntry> ple = fieldResult.getPicklistValues(); for (Schema.PicklistEntry f: ple) { options.add(new SelectOption(f.getLabel(), f.getValue())); } return options; }
Ich habe immer wieder leere Ergebnisse erhalten, und das nur, als ich mich geändert habe Der Antworttyp, bei dem ich feststellte, dass es sich um ein Problem mit der SelectOption-Klasse handelt. Dies ist Standard-Apex, aber es ist nicht Aura-fähig. Meine eigene Version davon ist:
public class SelectOption { public SelectOption(String value, String label) { this.value = value; this.label = label; this.disabled = false; this.escapeItem = false; } public SelectOption(String value, String label, Boolean isDisabled) { this.value = value; this.label = label; this.disabled = isDisabled; this.escapeItem = false; } @AuraEnabled public String label { get;set; } @AuraEnabled public String value { get;set; } @AuraEnabled public Boolean disabled { get;set; } @AuraEnabled public Boolean escapeItem { get;set; } }
Ich bin nicht sicher, ob dies helfen wird Das Problem, mit dem Sie konfrontiert sind, aber es könnte etwas sein, das Sie untersuchen können.
Kommentare
- Dies ist genau das Problem. Mein eigentlicher Code war Rückgabe einer Sammlung von ConnectApi.FollowingPage. Ich dachte zunächst darüber nach, einen Wrapper für FollowingPage zurückzugeben, um einfach die Nutzlastgröße zu reduzieren. Ich wünschte, ich könnte sowohl Ihre als auch die Antworten von Peter ' akzeptieren / li>
- Gibt es eine Möglichkeit, einige der Standardklassen wie SelectOption oder ConnectApi.FollowingPage automatisch @AuraEnabled zu machen? Im Moment ist es viel einfacher, nur die JSON-Serialisierung und -Deserialisierung (zwei LOC) zu verwenden.
- Außerdem fand ich es hilfreich, die Klasse als Controller zu meiner Aura-Komponente hinzuzufügen. Danach begannen Daten durchzuziehen, als ich die Methode innerhalb der Datei controller.js anstelle der leeren Arrays aufrief, die ich erhalten hatte
.
Antwort
Wenn Sie dies nicht zum Laufen bringen können, besteht eine Problemumgehung darin, JSON zu verwenden Um das Problem zu umgehen, ändern Sie Ihren Rückgabetyp in String und geben dann den JSON-String des Objekts zurück.
Beispiel:
Wenn Sie im Controller Folgendes haben:
@AuraEnabled public static MyClass getMyInstanceOfClass() { // do stuff MyClass myClassInst = getSomehow(); // do other stuff return myClassInst; }
Ändern Sie es in:
@AuraEnabled public static String getMyInstanceOfClass() { // do stuff MyClass myClassInst = getSomehow(); // do other stuff return JSON.serialize(myClassInst); }
Dann in Ihrem JS:
var yourClassObj = JSON.parse( action.getReturnValue() );
Kommentare
- Dies ist eine funktionierende Alternative und soweit ich ' Ich habe mich mit der akzeptierten Lösung befasst, bis ich eine Erklärung dafür sehe, warum sie ' nicht sofort funktioniert hat. Danke Peter!