追加編集画面表示イベントからチェンジイベントを発生させた場合の挙動について

いつもお世話になっております。

下記の例ですが追加編集画面表示時にAAAフィールドは「10」に、BBBフィールドは「20」に更新されましたが、CCCフィールドは更新されませんでした。

追加編集画面表示イベントでAAAフィールドの値を更新しeventを返した後に、AAAのチェンジイベントの処理は発生していますがCCCフィールドが更新されない原因はわかりますでしょうか。

 

AAAフィールドを手動で編集した場合は、BBBフィールドは「20」に、CCCフィールドは「30」に正常に更新されております。

※AAA、BBB、CCCは数値フィールドです。

宜しくお願いします。

(function () {
"use strict";

// 1.追加・編集画面表示イベント
kintone.events.on(['app.record.create.show', 'app.record.edit.show'], function (event) {
event.record.AAA.value = 10;
return event;
});

// 2.AAAフィールド 追加・編集画面チェンジイベント
kintone.events.on(['app.record.create.change.AAA', 'app.record.edit.change.AAA'], function (event) {
event.record.BBB.value = 20;
event.record.CCC.value = 30;
return event;
});
})();

 

編集画面表示後の結果

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#step3


※文字列(1行)と数値フィールドに関して、イベントが発生するタイミングは以下の通りです。ブラウザによって少し挙動が異なります。

  • コントロールからフォーカスが外れたタイミング
  • ルックアップで値がコピーされたタイミング
  • 文字列(1行)フィールドで「自動計算する」設定になっている場合は、自動計算が反映されたタイミング(レコード一覧画面の編集時は、自動計算処理自体が無効なため対象外)

 

とリファレンスにありますので、create.showなどでは変更されないものだと思います。

そもそもですが、create.show/edit.showなどで値を変えたい場合はその中で記述しきるのがよさそうですね。

(function () {
"use strict";

// 1.追加・編集画面表示イベント
kintone.events.on(['app.record.create.show','app.record.edit.show'],function (event) {
event.record.AAA.value =10;
event.record.BBB.value =20; // ここでやってしまう
event.record.CCC.value =30;
returnevent;
});
})();

 

また、change.AAAイベントなどは多用しすぎると再計算されるタイミングとか何を変更したら他のフィールドがどうなる?などの副作用がわかりにくくなるため、必要最低限に抑えたほうがいいと個人的には感じています。

コメントありがとうございます。

プログラムでフィールドの値を変更した際に発生するchangeイベントは上記に記載いただいた「イベントが発生するタイミング」の通り対象外のため保証されていないということなのですね。

仕様上changeイベントの処理は必須で、create.show/edit.showからchangeイベントを発生させることができれば処理の記述が冗長にならずに済むと思いましたが、一部のフィールドのみ値が更新されるとなると動作が不安定なためchangeイベントは慎重に使った方がよいですね。。。

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

そうですね、冗長になるのを避けるのであれば関数を定義しておくなどで回避したほうがよさそうです。

 

// 名前は適当です
// AAAが変わった時にBBB/CCCを再計算する関数
function calcBBBCCC(AAA) {
const BBB = AAA * 1.08; // 処理内容も適当です
const CCC = AAA * 1.10;
return {BBB: BBB, CCC: CCC};
}
(function () {
"use strict";
kintone.events.on(['app.record.create.show','app.record.edit.show'],function (event) {
event.record.AAA.value =10;
const result = calcBBBCCC(event.record.AAA.value);
event.record.BBB.value = result.BBB;
event.record.CCC.value = result.CCC;
returnevent;
});
});

あんまり好きじゃないですがこれでも

// 名前は適当です
// AAAが変わった時にBBB/CCCを再計算する関数
functioncalcBBBCCC(record) {
 record.BBB.value = record.AAA.value *1.08;// 処理内容も適当です
 record.CCC.value = record.AAA.value *1.10;
}

(function () {
"use strict";
kintone.events.on(['app.record.create.show','app.record.edit.show'],function (event) {
const record = event.record;
record.AAA.value =10;
calcBBBCCC(record);
 returnevent;
});
});

見当違いだったら申し訳ないのですが、

非同期処理にしてkintone.app.record.get()呼び出すのも手かと思いました!

(function () {
"use strict";

// 1.追加・編集画面表示イベント
kintone.events.on(['app.record.create.show','app.record.edit.show'],function (event) {
event.record.AAA.value =10;
returnevent;
});
// 2.AAAフィールド 追加・編集画面チェンジイベント
kintone.events.on(['app.record.create.change.AAA','app.record.edit.change.AAA'],function (event) {
        kintone.Promise.resolve().then(function() {
const rec = kintone.app.record.get();
rec.record.BBB.value =20;
rec.record.CCC.value =30;
kintone.app.record.set(rec);
});
});
})();

なるほど、若干ハック的?ですが、よさそうですね!

TK様

コメントありがとうございます。

非同期にしてレコードに値をセットする方法もよいですね!参考にさせて頂きます。今後のメンテナンスも考えてより良い方法を検討してみます。