Começando na página 141 do Guia do desenvolvedor de componentes do Lightning , eles listam os tipos válidos para atributos de aura. Classes e coleções do Apex estão incluídas, então escrevi um método controlador do Apex para retornar uma coleção de objetos Class do Apex para salvar posteriormente em um atributo.
Mas quando escrevo os resultados da chamada do meu método para o console javascript, vejo uma única matriz de elemento e o elemento não tem nenhuma propriedade diferente de __proto__. Eu vi este trabalho corretamente com coleções de primitivos e SObjects.
As classes do Apex não são realmente suportadas como retorno modelo? Eu sei que meu método @AuraEnabled está funcionando corretamente, e meu retorno de chamada de ação está simplesmente escrevendo o conteúdo de action.getReturnValue () no console.
Resposta
Uma coisa a verificar é se os acessadores em quaisquer objetos incluídos na resposta incluem a anotação @AuraEnabled. Por exemplo, o seguinte me enganou recentemente ao adaptar o código de amostra para um aplicativo 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; }
Continuei obtendo resultados vazios, e foi apenas quando mudei o tipo de resposta que percebi que era um problema com a classe SelectOption. Este é o Apex padrão, mas não é habilitado para Aura. Minha própria versão dele é:
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; } }
Não tenho certeza se isso vai ajudar com o problema que você está enfrentando, mas pode ser algo que você possa examinar.
Comentários
- Este é exatamente o problema. Meu código real era retornando uma coleção de ConnectApi.FollowingPage. Inicialmente, pensei em retornar um wrapper para FollowPage para simplesmente reduzir o tamanho da carga útil. No entanto, gostaria de poder aceitar as respostas suas e de Peter '.
- Alguma possibilidade de fazer com que algumas das classes padrão, como SelectOption ou ConnectApi.FollowingPage, sejam automaticamente @AuraEnabled? No momento, é muito mais simples usar apenas serializar e desserializar JSON (dois LOC).
- Além disso, achei útil adicionar a classe como um controlador ao meu componente de aura. Depois disso, os dados começaram a surgir quando chamei o método dentro do controller.js em vez dos arrays em branco que estava recebendo antes.
Resposta
Se você não conseguir fazer isso funcionar, uma solução alternativa seria usar JSON para contornar o problema, alterando seu tipo de retorno para String e, em seguida, retornando a String JSON do objeto.
Por exemplo:
Se você tiver no controlador algo como:
@AuraEnabled public static MyClass getMyInstanceOfClass() { // do stuff MyClass myClassInst = getSomehow(); // do other stuff return myClassInst; }
Altere para:
@AuraEnabled public static String getMyInstanceOfClass() { // do stuff MyClass myClassInst = getSomehow(); // do other stuff return JSON.serialize(myClassInst); }
Então em seu JS:
var yourClassObj = JSON.parse( action.getReturnValue() );
Comentários
- Esta é uma alternativa de trabalho, e tanto quanto eu ' estou preocupado com a solução aceita até que vejo uma explicação de por que ela não ' funcionou fora da caixa. Obrigado, Peter!