@AuraEnabled Suport pentru tipurile de returnare a clasei Apex?

Începând de la pagina 141 din Ghidul pentru dezvoltatori Lightning Components , acestea enumeră tipurile valide pentru atributele aura. Sunt incluse clasele și colecțiile Apex, așa că am scris o metodă de controler apex pentru a returna o colecție de obiecte Apex Class pentru a le salva ulterior într-un atribut ..

Dar când scriu rezultatele apelării metodei mele la consola javascript, văd o matrice de elemente și elementul nu are alte proprietăți decât __proto__. Am „văzut corect acest lucru cu colecții de primitive și SObjects.

Sunt clasele Apex care nu sunt de fapt acceptate ca returnare tip? Știu că metoda mea @AuraEnabled funcționează corect, iar callback-ul meu pentru acțiune scrie pur și simplu conținutul action.getReturnValue () în consolă.

Răspuns

Un lucru de verificat este că accesorii de pe orice obiecte incluse în răspuns includ adnotarea @AuraEnabled. De exemplu, următoarele lucruri m-au dezlănțuit recent când am adaptat codul eșantion pentru o aplicație 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; } 

Am obținut rezultate goale și a fost doar când am schimbat tipul de răspuns pe care l-am realizat este o problemă cu clasa SelectOption. Acesta este Apex standard, dar nu este compatibil cu Aura. Versiunea mea este:

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; } } 

Nu sunt sigur dacă acest lucru vă va ajuta problema cu care vă confruntați, dar ar putea fi ceva pe care să îl puteți examina.

Comentarii

  • Aceasta este exact problema. Codul meu real era returnarea unei colecții de ConnectApi.FollowingPage. M-am gândit inițial să returnez un wrapper pentru FollowingPage pentru a reduce pur și simplu dimensiunea sarcinii utile. Mi-aș dori să accept atât răspunsurile dvs., cât și pe cele ale lui Peter ', totuși.
  • Orice posibilitate de a face ca unele dintre clasele standard, cum ar fi SelectOption sau ConnectApi.FollowingPage să fie automat @AuraEnabled? În acest moment este mult mai simplu să folosiți doar serializarea și deserializarea JSON (două LOC).
  • De asemenea, mi s-a părut util să adaug clasa ca controler la componenta mea aura. După aceasta, datele au început să treacă atunci când am apelat metoda din controller.js în loc de matricile goale pe care le primeam. mai înainte.

Răspuns

Dacă nu puteți face acest lucru, o soluție ar fi să utilizați JSON pentru a rezolva problema, schimbând tipul de returnare la String și apoi returnând șirul JSON al obiectului.

De exemplu:

Dacă aveți în controler ceva de genul:

@AuraEnabled public static MyClass getMyInstanceOfClass() { // do stuff MyClass myClassInst = getSomehow(); // do other stuff return myClassInst; } 

Schimbă-l în:

@AuraEnabled public static String getMyInstanceOfClass() { // do stuff MyClass myClassInst = getSomehow(); // do other stuff return JSON.serialize(myClassInst); } 

Apoi în JS:

var yourClassObj = JSON.parse( action.getReturnValue() ); 

Comentarii

  • Aceasta este o alternativă funcțională și în măsura în care eu ' M-am preocupat de soluția acceptată până când văd o explicație de ce nu a funcționat '. Mulțumesc Peter!

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *