Lightningコンポーネント開発者ガイドの141ページから、有効なタイプがリストされています。オーラ属性の場合。 Apexクラスとコレクションが含まれているので、後で属性に保存するためにApexクラスオブジェクトのコレクションを返すapexコントローラーメソッドを作成しました。
しかし、メソッドを呼び出した結果をjavascriptコンソールでは、単一の要素配列が表示され、要素には__proto__以外のプロパティがありません。これはプリミティブとSObjectのコレクションで正しく機能することを確認しました。
Apexクラスは実際には戻り値としてサポートされていません。タイプ? @AuraEnabledメソッドが正しく機能していることはわかっています。アクションのコールバックは、action.getReturnValue()の内容をコンソールに書き込むだけです。
回答
確認すべきことの1つは、応答に含まれるオブジェクトのアクセサーに@AuraEnabledアノテーションが含まれていることです。たとえば、最近、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; }
空の結果が表示され続けましたが、それは変更したときだけでした。 SelectOptionクラスの問題であることに気付いた応答タイプ。これは標準のApexですが、Auraに対応していません。私自身のバージョンは次のとおりです。
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; } }
これが役立つかどうかはわかりませんあなたが直面している問題ですが、調査できるものかもしれません。
コメント
- これはまさに問題です。私の実際のコードはConnectApi.FollowingPageのコレクションを返します。最初は、ペイロードサイズを単純に減らすために、FollowingPageのラッパーを返すことを考えていました。ただし、あなたとPeter 'の両方の回答を受け入れることができればと思います。
- SelectOptionやConnectApi.FollowingPageなどの一部の標準クラスを自動的に@AuraEnabledにする可能性はありますか?今のところ、JSONのシリアル化と逆シリアル化(2つのLOC)を使用する方がはるかに簡単です。
- また、クラスをコントローラーとしてauraコンポーネントに追加すると便利でした。その後、受け取った空白の配列ではなく、controller.js内のメソッドを呼び出すと、データがプルスルーされ始めました。
回答
これを機能させることができない場合、回避策はJSONを使用することです。問題を回避するには、戻り値の型をStringに変更してから、オブジェクトのJSON文字列を返します。
例:
コントローラーに次のようなものがある場合:
@AuraEnabled public static MyClass getMyInstanceOfClass() { // do stuff MyClass myClassInst = getSomehow(); // do other stuff return myClassInst; }
次のように変更します:
@AuraEnabled public static String getMyInstanceOfClass() { // do stuff MyClass myClassInst = getSomehow(); // do other stuff return JSON.serialize(myClassInst); }
次にJSで:
var yourClassObj = JSON.parse( action.getReturnValue() );
コメント
- これは実用的な代替手段であり、私にとっては'すぐに使用できない理由についての説明が表示されるまで、受け入れられたソリューションに関心がありました。'ピーターに感謝します!