Beginnend op pagina 141 van De Lightning Components Developer Guide , geven ze een lijst van de geldige typen voor aura-attributen. Apex-klassen en -verzamelingen zijn inbegrepen, dus ik heb een apex-controller-methode geschreven om een verzameling Apex-klasse-objecten terug te sturen om later op te slaan in een attribuut.
Maar wanneer ik de resultaten schrijf van het aanroepen van mijn methode naar de javascript-console, ik zie een enkel elementarray en het element heeft geen andere eigenschappen dan __proto__. Ik heb dit correct zien werken met verzamelingen primitieven en SObjects.
Worden Apex-klassen niet echt ondersteund als een terugkeer type? Ik weet dat mijn @AuraEnabled-methode correct werkt, en mijn actie-callback is simpelweg het schrijven van de inhoud van action.getReturnValue () naar de console.
Answer
Een ding om te controleren is dat de accessors van alle objecten in het antwoord de @AuraEnabled-annotatie bevatten. Het volgende viel me bijvoorbeeld onlangs tegen bij het aanpassen van voorbeeldcode voor een Lightning-toepassing:
@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; }
Ik kreeg steeds lege resultaten, en dat was pas toen ik veranderde het antwoordtype waarvan ik me realiseerde dat het een probleem was met de SelectOption-klasse. Dit is standaard Apex, maar het is niet Aura-enabled. Mijn eigen versie ervan is:
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; } }
Ik weet niet zeker of dit zal helpen bij het probleem waarmee u “geconfronteerd wordt, maar het kan iets zijn waar u naar kunt kijken.
Opmerkingen
- Dit is precies het probleem. Mijn eigenlijke code was het retourneren van een verzameling ConnectApi.FollowingPage. Ik dacht er aanvankelijk over om een wrapper voor FollowingPage te retourneren om eenvoudig de payload-grootte te verkleinen. Ik wou dat ik zowel de antwoorden van jou als die van Peter ' s kon accepteren.
- Is er een mogelijkheid om sommige standaardklassen zoals SelectOption of ConnectApi.FollowingPage automatisch @AuraEnabled te maken? Op dit moment is het veel eenvoudiger om de JSON te gebruiken voor serialiseren en deserialiseren (twee LOCs).
- Ik vond het ook handig om de klasse als controller toe te voegen aan mijn aura-component. Hierna begonnen de gegevens door te trekken toen ik de methode in de controller.js aanriep in plaats van de lege arrays die ik ontving ing voor.
Answer
Als je dit niet kunt laten werken, zou een oplossing zijn om JSON te gebruiken om het probleem te omzeilen, door je retourtype te veranderen in String en vervolgens de JSON String van het object te retourneren.
Bijvoorbeeld:
Als je in de controller iets hebt als:
@AuraEnabled public static MyClass getMyInstanceOfClass() { // do stuff MyClass myClassInst = getSomehow(); // do other stuff return myClassInst; }
Verander het in:
@AuraEnabled public static String getMyInstanceOfClass() { // do stuff MyClass myClassInst = getSomehow(); // do other stuff return JSON.serialize(myClassInst); }
Vervolgens in je JS:
var yourClassObj = JSON.parse( action.getReturnValue() );
Reacties
- Dit is een werkend alternatief, en voor zover ik ' m betrof de geaccepteerde oplossing totdat ik een verklaring zie waarom het niet ' out-of-the-box werkte. Bedankt Peter!