A partire dalla pagina 141 della Guida per sviluppatori di componenti Lightning , vengono elencati i tipi validi per gli attributi dellaura. Le classi e le raccolte Apex sono incluse, quindi ho scritto un metodo controller apex per restituire una raccolta di oggetti della classe Apex da salvare in seguito in un attributo ..
Ma quando scrivo i risultati della chiamata del mio metodo a nella console javascript, vedo un singolo array di elementi e lelemento non ha proprietà diverse da __proto__. Ho visto che funziona correttamente con raccolte di primitive e SObject.
Le classi Apex non sono effettivamente supportate come ritorno genere? So che il mio metodo @AuraEnabled funziona correttamente e il mio callback dellazione sta semplicemente scrivendo il contenuto di action.getReturnValue () sulla console.
Rispondi
Una cosa da controllare è che le funzioni di accesso su qualsiasi oggetto incluso nella risposta includano lannotazione @AuraEnabled. Ad esempio, il seguente mi ha fatto inciampare di recente durante ladattamento del codice di esempio per unapplicazione Lightning:
@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; }
Continuavo a ricevere risultati vuoti ed era solo quando ho cambiato il tipo di risposta che ho capito era un problema con la classe SelectOption. Questo è Apex standard, ma non è abilitato per Aura. La mia versione è:
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; } }
Non sono sicuro che questo possa aiutare con il problema che stai affrontando, ma potrebbe essere qualcosa che puoi esaminare.
Commenti
- Questo è esattamente il problema. Il mio codice effettivo era restituendo una raccolta di ConnectApi.FollowingPage. Inizialmente ho pensato di restituire un wrapper per FollowingPage per ridurre semplicemente le dimensioni del payload. Vorrei poter accettare sia la tua risposta che quella di Peter '.
- Qualche possibilità di rendere automaticamente @AuraEnabled alcune delle classi standard come SelectOption o ConnectApi.FollowingPage? In questo momento è molto più semplice utilizzare JSON serializzare e deserializzare (due LOC).
- Inoltre, ho trovato utile aggiungere la classe come controller al mio componente aura. Dopodiché, i dati hanno iniziato a passare attraverso quando ho chiamato il metodo allinterno del controller.js invece degli array vuoti che stavo ricevendo prima di iniziare.
Risposta
Se non riesci a farlo funzionare, una soluzione alternativa sarebbe usare JSON per aggirare il problema, modificando il tipo di ritorno in String e quindi restituendo la stringa JSON delloggetto.
Ad esempio:
Se nel controller è presente qualcosa del tipo:
@AuraEnabled public static MyClass getMyInstanceOfClass() { // do stuff MyClass myClassInst = getSomehow(); // do other stuff return myClassInst; }
Modificalo in:
@AuraEnabled public static String getMyInstanceOfClass() { // do stuff MyClass myClassInst = getSomehow(); // do other stuff return JSON.serialize(myClassInst); }
Quindi nel tuo JS:
var yourClassObj = JSON.parse( action.getReturnValue() );
Commenti
- Questa è unalternativa funzionante e, per quanto mi riguarda ' ero preoccupato per la soluzione accettata fino a quando non vedo una spiegazione del motivo per cui ' non ha funzionato immediatamente. Grazie Peter!