【詳細画面】非同期処理で取得したデータを登録した後に、リロードせずに登録内容を画面に反映したい。

プラグインの開発にて、詳細画面を開いたときに非同期処理で取得したデータをREST APIで登録(更新)して、登録した内容をリロードせずに詳細画面に反映した後のことで問題を抱えています。

データ登録(更新)、画面反映後に画面をリロードせずに編集画面を開き、編集後保存ボタンを押すと次のエラーが出ます。

エラー

  • レコードを再読み込みしてください。編集中に、ほかのユーザーがレコードを更新しました。
  • (GAIA_UN03 dxcuupA4LQhV9QkeSnHq)

 

処理の流れは次のようにしています。

1)kintone.events.on(‘app.record.detail.show’, function(){});内で非同期処理を実行してデータを取得。

2)(1)のコールバック関数内にて、kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, body, function(resp) {“成功時の処理”}, function(resp) {“失敗時の処理”});を実行して取得したデータを登録(更新)。

3)登録(更新)成功時にkintone.app.record.getFieldElement(“フィールド名”).textContent にて画面に反映。

 

画面の反映は(3)の方法にてjavascriptで動的に詳細画面のフィールドを書き換えています。

リロードをしない理由は、プラグイン使用者のストレスを減らすためです。

(リロードの処理を入れると、本プラグインの運用上、利用者が頻繁にプラグインによる画面のリロードを見せられることになりストレスが大きいと考えたため。)

 

REST APIで登録(更新)した後に、リロードせずにリロードしたときと同じ状態の画面にする(上記エラーが出ないようにする)良い方法はありますか?

 

REST APIを使用しているのは、非同期処理後だと下記URLのフィールドの値を書き換える処理が上手くいかなかったためです。(非同期処理後はkintone.events.onを抜けているので return event ができていない?)

URL: https://developer.cybozu.io/hc/ja/articles/202166270-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E7%B7%A8%E9%9B%86%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88#step4 

詳細画面を開いたタイミングでの非同期処理によるデータの取得は必須です。非同期処理後にREST APIを使用せずにフィールドの値を書き換える(kintoneのDBを更新する)方法があればそちらも教えて頂きたいです。

 

現在の私のkintoneの仕様の認識は次の通りです。

・非同期処理後の詳細画面のフィールドの更新はREST APIにて行う必要がある。

・詳細画面にてREST APIによる更新を行った場合、更新内容の画面への反映はリロードが必須である。(リロードしないと変更前の状態が維持され上記エラーが出る。)

この認識で合っている場合は毎回リロードをするのは仕方がないと考えます。

 

<追記>

処理は全て詳細画面内で実行します。

編集画面は詳細画面右上のアイコンをクリックして表示した時のことです。(ページの遷移はなし。)

 

以上、宜しくお願いします。

higuchi-dandi様

お世話になっております.
cstapの江田と申します.

レコード追加画面やレコード編集画面では,eventオブジェクトを書き換えてreturnしたり,kintone.app.record.setを使うことで,画面に表示する値を書き換えできますが,レコード詳細画面の表示イベントではそれらは利用できません.
画面に表示する値を書き換えたいだけであれば(DBの更新が必要ないのであれば),直接DOM操作するのが良いと思います.
レコード詳細画面では,kintone.app.record.getFieldElementでフィールド要素を取得できます.

kintone.api(kintone.api.url('/k/v1/records',true),'GET',{//データの取得app:\*\*\*\*}).then(function(response){...//データ整理kintone.app.record.getFieldElement('書き換えるフィールドのフィールドコード').innerText='書き換え後の値';//表示する値の書き換え});

DBを更新も必要な場合は,編集前にリロードは必要です.
あまり大差ないかもしれませんが,編集画面に入るときにリロードをかけるようにすれば,頻度を最小に抑えられるかと思います.

kintone.events.on(['app.record.edit.show'],function(event){kintone.api(kintone.api.url('/k/v1/record',true),'GET',{app:kintone.app.getId(),id:kintone.app.record.getId()}).then(function(response){if(response.record.$revision.value!==event.record.$revision.value)location.reload();});});

江田篤史様

ご回答ありがとうございます。

 

REST APIでデータの登録をした場合、一度リロードをすることにしました。