@AuraEnabled Prise en charge des types de retour de classe Apex?

À partir de la page 141 du Guide du développeur de composants Lightning , ils répertorient les types valides pour les attributs daura. Les classes et collections Apex sont incluses, jai donc écrit une méthode de contrôleur apex pour renvoyer une collection dobjets de classe Apex à enregistrer ultérieurement dans un attribut.

Mais quand jécris les résultats de lappel de ma méthode à la console javascript, je vois un tableau délément unique et lélément na aucune propriété autre que __proto__. Jai vu cela fonctionner correctement avec des collections de primitives et de SObjects.

Les classes Apex ne sont-elles pas réellement prises en charge en retour taper? Je sais que ma méthode @AuraEnabled fonctionne correctement, et mon rappel daction écrit simplement le contenu de action.getReturnValue () dans la console.

Réponse

Une chose à vérifier est que les accesseurs sur tous les objets inclus dans la réponse incluent lannotation @AuraEnabled. Par exemple, ce qui suit ma trébuché récemment lors de ladaptation dun exemple de code pour une application 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; } 

Jai continué à obtenir des résultats vides, et ce nest que lorsque jai changé le type de réponse que jai réalisé que cétait un problème avec la classe SelectOption. Il sagit dApex standard, mais il « nest pas compatible avec Aura. Ma propre version est:

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

Je ne sais pas si cela vous aidera le problème auquel vous êtes confronté, mais vous pouvez peut-être vous en occuper.

Commentaires

  • Cest exactement le problème. Mon code actuel était renvoyer une collection de ConnectApi.FollowingPage. Jai dabord pensé à renvoyer un wrapper pour la page suivante pour simplement réduire la taille de la charge utile. Jaurais aimé pouvoir accepter à la fois la vôtre et les réponses de Peter '. / li>
  • Est-il possible de faire en sorte que certaines des classes standard telles que SelectOption ou ConnectApi.FollowingPage soient automatiquement @AuraEnabled? À lheure actuelle, il est beaucoup plus simple dutiliser simplement la sérialisation et la désérialisation JSON (deux LOC).
  • De plus, jai trouvé utile dajouter la classe en tant que contrôleur à mon composant aura. Après cela, les données ont commencé à passer lorsque jai appelé la méthode à lintérieur du controller.js au lieu des tableaux vierges que je recevais avant.

Réponse

Si vous ne pouvez pas faire fonctionner cela, une solution de contournement serait dutiliser JSON pour contourner le problème, en changeant votre type de retour en String, puis en renvoyant la chaîne JSON de lobjet.

Par exemple:

Si vous avez dans le contrôleur quelque chose comme:

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

Remplacez-le par:

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

Puis dans votre JS:

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

Commentaires

  • Ceci est une alternative fonctionnelle, et pour autant que je ' m concernait la solution acceptée jusquà ce que je voie une explication quant à la raison pour laquelle elle na ' pas fonctionné de façon immédiate. Merci Peter!

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *