#はじめに
レコードページからユーティリティバーのボタンを押し、
そのレコードに関連するレコード一覧をAuraコンポーネントを介して
表示させようとしたときに困ったことがあったのでまとめてみました。
#1 initイベントでレコードIDを取得できない
レコードIDを取得する方法は通常、
以下の方法で行うと思います。
<aura:component implements="force:hasRecordId,force:lightningQuickAction,flexipage:availableForAllPageTypes" >
<aura:handler name="init" action="{!c.doInit}" value="{!this}"/>
</aura:component>
({
doInit: function(component, helper, event){
var recordId = component.get("v.recordId");
alert("initで:" + recordId);
}
})
しかし、ユーティリティバーからAuraコンポーネントを呼び出した場合、
initメソッド内でcomponent.get("v.recordId")を使用しても
レコードIDを取得できません。
しかし、cmp側で{!v.recordId}を指定するとちゃんとレコードIDが表示されるのです。
<p>The current recordId is {!v.recordId}.</p> // 表示される
<ui:outputText aura:id="recId" value="{!v.recordId}"/> // こっちも表示される
ならばとoutputTextにIdを設定してfindメソッド使えば取れるんじゃないかと試しました。
var recordId = component.find('recId').get("v.value");
alert("findで":recordId);
さてどうしたものか、とさらにググってみると…
#2 解決方法
公式ドキュメントで解決方法が記載されていました。
ユーティリティバー API でのページコンテキストの使用:
https://developer.salesforce.com/docs/atlas.ja-jp.api_console.meta/api_console/sforce_api_console_js_lightning_utility_bar_page_context.htm
ドキュメントによれば、initイベントを使用するのでなく
changeイベントを使用するとよいとのこと。
試してみます。
<aura:component implements="force:hasRecordId,force:lightningQuickAction,flexipage:availableForAllPageTypes" >
<aura:handler name="change" value="{!v.recordId}" action="{!c.onRecordIdChange}"/>
</aura:componnt>
({
onRecordIdChange : function(component, event, helper) {
var recordId = component.get("v.recordId");
alert("onchangeで:" + recordId);
}
})
#3 Auraコンポーネントで呼びだしたフローをリセットできない
※こちらはまだ未解決の問題です。
取得したレコードIDを使ってさらにフローで処理できないか相談を受けたので
調査しました。
結論から言えば、flowに取得したIDをフロー渡して処理を行えます。
詳しくはこちら:https://developer.salesforce.com/docs/atlas.ja-jp.lightning.meta/lightning/components_using_flow.htm
ただひとつ問題が。
別のレコードページに移動しても、最初にユーティリティバーで起動した
レコードIDを使ったままなのです。
changeイベントを使用しているので、見るレコードが変わるたびにイベントを呼び、実際にレコードIDも新しいものを取得できているのにも関わらずにです。
以下のことを試してみましたがフローの内容がリセットされませんでした。
- cmp側でforce:refleshViewイベントを宣言してみる
- コントローラで$A.get('e.force:refreshView').fire()を行う
こちらについては引き続き調べてみたいと思います。