はじめに
intra-martスクリプト開発にて、嵌ったことを未来の自分あてに情報共有できればと考えています。
※なおQiitaへの投稿は初めてなので、多少見苦しかったらすみません・・・。
やりたいこと
- 画面には、出力日時を表示するラベル、ならびに、出力ボタンが存在している
- 出力ボタンでファイルを作成し、Storageに保存する
- 作成したファイルを即座にダウンロード
- ダウンロードできたら自画面をリロードして、出力日時ラベルを更新
はまった現象
HTML側からformのaction属性にて指定した関数を呼び出し、
同関数内でファイルを作成⇒ファイルのダウンロードまではできたが、
自画面のリロードは行われず、出力日時が更新されなかった
原因
ダウンロードをするのに使用したAPI(Module.download.send)は
現在実行中のプログラムを中断してダウンロード処理を行うため、
当該APIをコールした時点で処理が中断され、ファンクションコンテナのinit関数もコールされなかったもよう・・・。
https://www.intra-mart.jp/apidoc/iap/apilist-ssjs/doc/platform/Module.download/index.html#method-send_4
対応策
-
【HTML】formをファイル作成用、ダウンロード用の2つに分けます。
1つめのformに出力ボタンを、2つめのformの隠し項目として、作成したファイルのパス、ファイル名をバインド変数にて設定します。(初回アクセス時は空です) -
【JS】出力ボタンを押下した際にコールされる関数では、ファイル作成のみ行います。
-
ファイル作成ができたら、作成したファイルのパス、名称、ファイル作成フラグ、出力日時を引数のrequestオブジェクトに設定しましょう。
-
【JS】init関数にて、requestオブジェクトから上記4つ(ファイルパス、ファイル名、ファイル作成フラグ、出力日時)を取得し、バインド変数に設定します。
-
【HTML】onload時、ファイル作成フラグが立っている場合、ダウンロード用formをsubmit
-
【JS】コールされた関数内で、引数のrequestにファイルパス、ファイル名が渡ってくるので、ここでようやくModule.download.sendを実行
備考
自画面にリロードするために「imart type="form"」を使っていましたが、どうやら非推奨のようです。。。
https://www.intra-mart.jp/apidoc/iap/apilist-jssp-tagdoc/doc/imart_tag_api/form/index.html
それと、今気づいたのですが、タイトル詐欺ですね・・・
結局の対応策は、自画面をリロード後にファイルをダウンロードでした。。
以上です。