@AuraEnabled Wsparcie dla typów zwrotów klas Apex?

Zaczynając na stronie 141 w Podręczniku programisty komponentów Lightning , zawierają one listę prawidłowych typów dla atrybutów aury. Klasy i kolekcje Apex są uwzględnione, więc napisałem metodę kontrolera apex, aby zwrócić kolekcję obiektów klasy Apex do późniejszego zapisania do atrybutu.

Ale kiedy piszę wyniki wywołania mojej metody do w konsoli javascript widzę tablicę z jednym elementem, a element nie ma innych właściwości niż __proto__. Widziałem, jak działa to poprawnie z kolekcjami prymitywów i obiektów SObject.

Czy klasy Apex nie są faktycznie obsługiwane jako zwrot rodzaj? Wiem, że moja metoda @AuraEnabled działa poprawnie, a moje wywołanie zwrotne akcji po prostu zapisuje zawartość action.getReturnValue () w konsoli.

Odpowiedź

Jedną rzeczą do sprawdzenia jest to, że metody dostępu do dowolnego obiektu zawartego w odpowiedzi zawierają adnotację @AuraEnabled. Na przykład podczas dostosowywania przykładowego kodu dla aplikacji Lightning zaskoczyły mnie następujące kwestie:

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

Ciągle otrzymywałem puste wyniki i dopiero po zmianie typ odpowiedzi, z którego zdałem sobie sprawę, że jest to problem z klasą SelectOption. To jest standardowy Apex, ale nie obsługuje Aury. Moja wersja to:

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

Nie jestem pewien, czy to pomoże problem, z którym się „masz do czynienia, ale może to być coś, czemu możesz się przyjrzeć.

Komentarze

  • To jest właśnie problem. Mój rzeczywisty kod był zwracanie kolekcji ConnectApi.FollowingPage. Początkowo myślałem o zwróceniu opakowania dla FollowPage, aby po prostu zmniejszyć rozmiar ładunku. Chciałbym jednak zaakceptować odpowiedzi zarówno twoje, jak i Petera '.
  • Czy istnieje możliwość, aby niektóre ze standardowych klas, takich jak SelectOption czy ConnectApi.FollowingPage, były automatycznie @AuraEnabled? Obecnie znacznie prostsze jest użycie serializacji JSON i deserializacji (dwa LOC).
  • Pomogło mi również dodanie klasy jako kontrolera do mojego komponentu aury. Po tym, dane zaczęły być pobierane, gdy wywołałem metodę wewnątrz kontrolera.js zamiast pustych tablic, które otrzymałem ing wcześniej.

Odpowiedź

Jeśli nie możesz tego zrobić, obejściem byłoby użycie JSON aby obejść problem, zmieniając typ zwracanej wartości na String, a następnie zwracając ciąg JSON obiektu.

Na przykład:

Jeśli masz w kontrolerze coś takiego:

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

Zmień to na:

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

Następnie w Twoim JS:

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

Komentarze

  • To jest działająca alternatywa, o ile ja ' martwiłem się zaakceptowanym rozwiązaniem, dopóki nie zobaczę wyjaśnienia, dlaczego nie ' nie zadziałało od razu po wyjęciu z pudełka. Dzięki Peter!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *