@AuraEnabled ¿Soporte para tipos de devolución de clases de Apex?

A partir de la página 141 de Guía para desarrolladores de componentes Lightning , se enumeran los tipos válidos para los atributos del aura. Las clases y colecciones de Apex están incluidas, así que escribí un método de controlador de Apex para devolver una colección de objetos de la clase de Apex para luego guardarlos en un atributo.

Pero cuando escribo los resultados de llamar a mi método a la consola de JavaScript, veo una matriz de un solo elemento y el elemento no tiene otras propiedades que no sean __proto__. He visto que esto funciona correctamente con colecciones de primitivas y SObjects.

¿Las clases de Apex no son realmente compatibles como retorno? ¿escribe? Sé que mi método @AuraEnabled funciona correctamente, y mi devolución de llamada de acción es simplemente escribir el contenido de action.getReturnValue () en la consola.

Answer

Una cosa para verificar es que los accesos en cualquier objeto incluido en la respuesta incluyen la anotación @AuraEnabled. Por ejemplo, lo siguiente me hizo tropezar recientemente al adaptar un código de muestra para una aplicación 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; } 

Seguí obteniendo resultados vacíos, y fue solo cuando cambié el tipo de respuesta que me di cuenta de que era un problema con la clase SelectOption. Esto es Apex estándar, pero no está habilitado para Aura. Mi propia versión es:

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

No estoy seguro si esto ayudará con el problema que está enfrentando, pero podría ser algo que pueda investigar.

Comentarios

  • Este es exactamente el problema. Mi código real era devolviendo una colección de ConnectApi.FollowingPage. Inicialmente pensé en devolver un contenedor para FollowingPage para simplemente reducir el tamaño de la carga útil. Sin embargo, me gustaría poder aceptar las respuestas tuyas y de Peter '. / li>
  • ¿Alguna posibilidad de hacer que algunas de las clases estándar, como SelectOption o ConnectApi.FollowingPage, sean automáticamente @AuraEnabled? En este momento, es mucho más simple usar el JSON serializar y deserializar (dos LOC).
  • Además, me resultó útil agregar la clase como controlador a mi componente de aura. Después de esto, los datos comenzaron a aparecer cuando llamé al método dentro de controller.js en lugar de las matrices en blanco que recibí antes.

Respuesta

Si no puede hacer que esto funcione, una solución alternativa sería usar JSON para solucionar el problema, cambiando su tipo de retorno a String y luego devolviendo el JSON String del objeto.

Por ejemplo:

Si tiene en el controlador algo como:

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

Cámbielo a:

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

Luego, en su JS:

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

Comentarios

  • Esta es una alternativa funcional, y hasta donde yo ' m me preocupaba la solución aceptada hasta que veo una explicación de por qué no ' no funcionó de fábrica. ¡Gracias Peter!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *