Alkaen Lightning Components -kehittäjäoppaan sivulta 141, he luetteloavat kelvolliset tyypit auramääritteille. Apex-luokat ja -kokoelmat sisältyvät, joten olen kirjoittanut apex-ohjaimen menetelmän palauttamaan Apex-luokan objektien kokoelman myöhemmin tallennettavaksi attribuuttiin.
Mutta kun kirjoitan menetelmän kutsumisen tulokset javascript-konsolissa näen yhden elementtiryhmän ja elementillä ei ole muita ominaisuuksia kuin __proto__. Olen nähnyt tämän työn oikein primitiivien ja SObjektien kokoelmilla.
Eivätkö Apex-luokkia tueta palautuksena tyyppi? Tiedän, että @AuraEnabled -menetelmäni toimii oikein, ja toimintopyynnöni kirjoittaa vain action.getReturnValue () -sisällön konsolille.
Vastaa
Yksi asia on tarkistaa, että kaikkien vastaukseen sisältyvien objektien käyttöoikeudet sisältävät @AuraEnabled-merkinnän. Esimerkiksi seuraavat kaatui minut äskettäin sovitettaessa mallikoodia Lightning-sovellukseen:
@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; }
Tulin jatkuvasti tyhjiksi, ja vasta vasta kun muutin vastaustyyppi, jonka tajusin olevan ongelma SelectOption-luokassa. Tämä on vakio Apex, mutta se ei ole Auraa tukeva. Oma versio siitä on:
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; } }
En ole varma, auttaako tämä ongelma, jota kohtaat, mutta se voi olla jotain, jota voit tutkia.
Kommentit
- Tämä on juuri asia. Todellinen koodini oli palautin kokoelman ConnectApi.FollowingPage. Aluksi ajattelin palauttaa kääreen FollowPage-sovellukseen yksinkertaisesti pienentämään hyötykuormaa. Toivon, että voisin hyväksyä sekä sinun että Peterin ' vastaukset.
- Mahdollisuus tehdä joitain vakioluokkia, kuten SelectOption tai ConnectApi.FollowingPage automaattisesti @AuraEnabled? Tällä hetkellä on paljon yksinkertaisempaa käyttää vain JSON-sarjaa ja deserialisoida (kaksi LOC).
- Minusta oli myös hyödyllistä lisätä luokka ohjaimena aurakomponenttiin. Tämän jälkeen tietoja alkoi kulkeutua, kun kutsuin controller.js: n sisäistä menetelmää vastaanotettujen tyhjien matriisien sijaan ennen.
Vastaa
Jos et pysty saamaan tätä toimimaan, kiertotapa olisi JSON: n käyttö kiertääksesi ongelman vaihtamalla palautustyypiksi String ja palauttamalla sitten objektin JSON-merkkijono.
Esimerkiksi:
Jos ohjaimessa on jotain:
@AuraEnabled public static MyClass getMyInstanceOfClass() { // do stuff MyClass myClassInst = getSomehow(); // do other stuff return myClassInst; }
Muuta se muotoon:
@AuraEnabled public static String getMyInstanceOfClass() { // do stuff MyClass myClassInst = getSomehow(); // do other stuff return JSON.serialize(myClassInst); }
Sitten JS: ssäsi:
var yourClassObj = JSON.parse( action.getReturnValue() );
Kommentit
- Tämä on toimiva vaihtoehto, ja sikäli kuin minä ' m koski hyväksyttyä ratkaisua, kunnes näen selityksen siitä, miksi se ei toiminut alusta loppuun. Kiitos Peter!