未確認:クイックアクションから呼び出せばいい?
since this is a screen flow, if you just call it from a Quick Action instead of a button, it'll run as a modal and will refresh the page when it's finished
Error Occurred: Action failed: c:RefreshView$controller$invoke [Cannot read properties of undefined (reading 'fire')]
戻る方法は分かりましたが、画面がリフレッシュされていないのか、更新前の値が表示されます
どちらを指定しても元の画面には戻るのですが、リフレッシュされないですね。F5を押すと値が変わるけど...
&retURL={!kenmei__c.Id}
&retURL=/lightning/r/kenmei__c/{!kenmei__c.Id}/view
Auraコンポーネントを使って強制的にリフレッシュできそう。
はい、自動起動されたフローから更新画面のアクションをトリガーすることはできませんが、回避策は、更新画面のアクションを 1 つだけ含み、他には何も含まない画面フローを作成することです。次に、ボタンの URL にretURL最初に更新画面を含む画面フローの参照を含めてから、retURLレコード用に別の画面フローを追加します。これは私にとっては完璧に機能し、画面が更新されました。
残念ですがエラーが解消しないですね。
エラーが発生しました: Action failed: c:RefreshView$controller$invoke [Cannot read properties of undefined (reading 'fire')]
window.location.reload();、location.reload();だとエラーは出ないのですが、画面遷移しないですね。
ヘルプの通りに作っても機能しません。何でだろうAuraコンポーネントのイベントが全く発火しない。
試しにfireを2回かいてみると
var urlEvent = $A.get("e.force:navigateToURL");
var myUrl = "/lightning/r/kenmei__c/" + record + "/edit";
urlEvent.setParams({
"url": myUrl
});
urlEvent.fire();
alert(myUrl);
urlEvent.fire();
エラーが発生しました: Assertion Failed!: Event.fire(): Unable to fire event. Event has already been fired. : false
既に発火したとさ... ということは何でイベントが発火してないんだろう。
最終的に...
今回の画面には自作したAuraコンポーネントを埋め込んでいたので、retURLで元のレコードを表示したときには
想定通りに
<aura:handler name="init" value="{!this}" action="{!c.doInit}"/>
が起動します。
仕方ないのでこのロジックの中で以下を追加して毎回強制的に親画面を再描画させました。
キャッシュが効いているのか標準画面はそのままでは再描画しませんね。バグのような気がします。
$A.get('e.force:refreshView').fire();//親画面の再描画
&retURL={!Account.Id}をつけると元のレコードページには戻ることはできるのですが、更新結果は表示されないです。(キャッシュが効いているのかもしれません。F5をクリックして再描画すれば表示内容は最新になります。この仕様には少々不満です)
/flow/update_lookup_see2?recordId={!Account.Id}&retURL={!Account.Id}
参考資料
バグ?
Why isn’t my local action working when I run my Flow from Flow Builder or a Custom Button?
Some local actions use events to cause things to happen in your browser. Show Toast and Flow Finishing
Fire Fox ,Edgeでも試しましたが、いずれも機能しないですね。
やっと見つけた 既知の問題になっている。
Aura events fired inside the Local Actions that are in a Flow rendered by the Lightning-flow aura tag were not properly bubbling outside the Lightning flow.
Lightning-flow aura タグによってレンダリングされたフロー内のローカル アクション内で起動された Aura イベントが、Lightning フローの外側で適切にバブリングしていませんでした。
解決したのかな?
関連の質問
カスタムボタンまたはカスタムリンクでも表示の種類を詳細ページボタンにすれば、アクションと同じようにボタンとして配置できる
これは機能しない
これがヒントになった
Component Markup
<aura:component controller="GetOrgBaseUrl2" implements="force:lightningQuickAction,lightning:availableForFlowActions">
<aura:dependency resource="markup://force:navigateToSObject" type="EVENT"/>
<aura:attribute name="recordId" type="String" />
</aura:component>
Client-Side Controller
({
invoke : function(component, event, helper) {
var record = component.get("v.recordId");
var action = component.get("c.getBaseUrl");
action.setCallback(this, function(response){
if (action.getState() == "SUCCESS") {
var BaseUrl = response.getReturnValue();
var myUrl= BaseUrl;
if (record.left(3) == '001') var myUrl = myUrl + "/lightning/r/Account/"+ record + "/view";
//window.location.href = myUrl;
} else if (action.getState() == "ERROR" ) {
}
});
$A.enqueueAction(action);
},
})
Component Markup
<design:component>
<design:attribute name="recordId" label="Record ID" />
</design:component>
bses URLを取得するApex class
public class GetOrgBaseUrl2 {
// ***********************************************************************************
// Base URL を取得する Apex
// K.Otsubo 2024/04/26
//
// ************************************************************************************
@AuraEnabled
public static String getBaseUrl() {
return URL.getCurrentRequestUrl().getAuthority();
}
}
test class
@isTest
public class GetOrgBaseUrl2_test {
// ***********************************************************************************
// Base URL を取得する Apex test
// K.Otsubo 2024/04/26
//
// ************************************************************************************
static testMethod void getBaseUrl_mainTest() {
Test.startTest();
String sfdcBaseURL=GetOrgBaseUrl2.getBaseUrl();
system.debug(sfdcBaseURL);
Test.stopTest();
}
}