以下のようなコードの場合、*/ここから*/を実行するとそれ以前のコードが実行されず、反対にコメントアウトで実行しなければ、それ以前のコードが実行されます。
コードの意図としては、3つのイベント時に(1)disableしたいものがあるまた、同イベント時に(2)非表示にしておきたい要素がある
これらを同時に記載しているというだけなのですが、どういうわけか上述の通り、動作しません。
原因と解決方法をどなたか、お力添えをください。。。
よろしくお願い申し上げます。
jQuery.noConflict();
(function($) {
"use strict";
var events =[
'app.record.index.edit.show',
'app.record.edit.show',
'app.record.create.show'
]
kintone.events.on(events, function(event) {
//適用ルートを編集不可
event.record['invisible']['disabled']=true;
event.record['adopt_root_dl']['disabled']=true;
//承認フラグを編集不可
event.record['LeaderApr']['disabled']=true;
event.record['COApr']['disabled']=true;
event.record['INVApr']['disabled']=true;
event.record['FPApr']['disabled']=true;
event.record['AAApr']['disabled']=true;
event.record['MGRApr']['disabled']=true;
event.record['CEOApr']['disabled']=true;
event.record['CCApr']['disabled']=true;
event.record['ICApr']['disabled']=true;
event.record['BMApr']['disabled']=true;
event.record['EOApr']['disabled']=true;
event.record['IBMApr']['disabled']=true;
//承認日付ならびに稟議番号を編集不可
event.record['ApprovedDate']['disabled']=true;
event.record['ApprovalNum']['disabled']=true;
event.record['ApprovalYear']['disabled']=true;
event.record['uniqueNum']['disabled']=true;
console.log(event);
return event;
});
/*ここから
var events2=[
'app.record.detail.show',
'app.record.create.show',
'app.record.edit.show'
]
kintone.events.on(events2, function(event){
kintone.app.record.setFieldShown('ApprovalYear', false);
kintone.app.record.setFieldShown('uniqueNum', false);
kintone.app.record.setFieldShown('invisible', false);
});
*/
})(jQuery);
16件のコメント
「ここから」の中の function にも、一番最後に return event; って書く必要がありそうです!
コメントありがとうございます。
藁をもすがるおもいだったので、お返事とてもありがたいです!さて、
マニュアルを見ると特にkintone.app.record.setFieldShownはreturn eventする必要がない(イベント寄与しない?)
ものに見えるのですが、なぜ必要なのでしょうか。。?
重ねて申し訳ございませんが、よろしくお願い申し上げます。
kintone.app.record.setFieldShown そのものはイベントと関係なく動作しますが、イベントハンドラが event を return しないと次の処理がうまくいきません。
kintone.events.on で順番にイベントハンドラを追加していきますが、それぞれは順番に動くので前のハンドラで終わった event を使う必要があります。
<追記>
上記文章の「それぞれは順番に動くので前のハンドラで終わった event を使う必要があります。」は誤りでした。
お返事いただき誠にありがとうございます。
1) イベントハンドラ1(各指定オブジェクトのプロパティに['disable'])を追加
2) 1個目のreturn eventで1個目1)が実行される
kintone.app.record.setFieldShownはイベントではないのでイベントハンドラとしては追加されていないので
当然に非表示が実行される
の流れを想像していたのですが、
"それぞれは順番に動くので前のハンドラで終わった event を使う必要があります。"という表現は
具体的にはどういう意味なのでしょうか、、(特に前のハンドラで終わったeventを使うとはいったいどういうことなのでしょうか、、)どうしても理解できずもうしわけございません。
本当に申し訳ございません。
この時、kintone.events.on() を実行しているので、events2 の配列に含まれる kintone の各イベントにイベントハンドラが追加されています。私がイベントハンドラと呼んでいるのは、下記の関数のことです。
そして、元のご質問で見落としていたのですが、'app.record.index.edit.show' と 'app.record.detail.show' はそれぞれ片方にしか定義がないのでうまくいきそうな気がします。実際にはどうでしょうか?
'app.record.create.show' と 'app.record.edit.show' は両方の配列に含まれてるので、1つ目の kintone.events.on() と 2つ目の kintone.events.on() で2個イベントハンドラが登録されています。そしてそれが順に実行されます。
コメントありがとうございます。
申し訳ございません、双方同じイベントを配列に含んだつもりがその点はコーディングミスです。
1つ目のイベントハンドラと2つ目のイベントハンドラそれぞれ順番実行されることは理解できました。
どうしてもreturn eventが不要なイベントハンドラ(setFieldShown達ですね)をreturn eventしなければ、それ以前の同じイベントとして登録されたイベントハンドラについて、実行されないというのが順番という論理から理解ができません。
1) kintone.events.on(events,でAイベントに初めのBイベントハンドラを登録(disable関係)
2) return eventでBイベントハンドラ処理を実行
3) kintone.events.on(events2,でAイベントに初めのCイベントハンドラを登録(SetField関係)
4) return eventしなくてもCイベントハンドラ処理は実行される関数のため問題なく実行
と思っていたのですが、以下の順番でもどちらも実行されそうな気がするのですが間違いなのでしょうか。。。
1) kintone.events.on(events,でAイベントに初めのBイベントハンドラを登録(disable関係)
2) kintone.events.on(events2,でAイベントに初めのCイベントハンドラを登録(SetField関係)
3) return eventでBイベントハンドラ処理を実行(実際にはここが実行されません、Cイベントハンドラにもreturn eventするとなぜか実行?)
4) return eventしなくてもCイベントハンドラ処理は実行される関数のため問題なく実行
ちょっと私自身も冷静にご記載いただいた内容を咀嚼して考えてみます。
色々と混乱を招いてしまいすみません。
こちらも、よく内容を読んで、実際にコードを書いて試してみました。
EVENT1、2どちらも実行されます。ですから、私の書いている内容は正しくありませんでした。
return event がないと実行されないという点、撤回します。
下記のコードは意図した通り文字列__1行__0の編集不可とルックアップ_0の非表示が設定されます。
しかし、下記のようにするとdiabled = trueは動作しなくなります。
こうなる理由については、今の所はっきりしないので私の方でも考えてみます。
このように記載を変更して、event オブジェクトの中身を見てみました。
その結果、EVENT2.3のときに呼び出されるイベントハンドラの event オブジェクトにおいて、event.record.文字列__1行__0.disabled == true であることがわかりました。
次に、このようにしてみました。
EVENT2.4, 3.4のいずれにおいても、event.record.文字列__1行__0.disabled == true でした。そして、予想に反して、入力不可処理と非表示処理はどちらも期待通り動作しています!
しかし、
こうすると、入力不可は動作しなくなります。
EVENT1.5, EVENT2.5, EVENT3.5 のいずれにおいても、event.record.文字列__1行__0.disabled == true です。
ここから推測されることは、kintoneは最後にイベントハンドラが返した event オブジェクトを処理していると思われる、ということです。
長々とすみません。
横から失礼します!
(ただの感想です)
この辺の挙動、気になってはいたんですけどちゃんと実験したことありませんでした。お二人のおかげで僕もかなり理解が深まりました。ありがとうございます。
EVENT2.4がreturn eventされた状態になるのはとても興味深いですね!
ボソッ)公式ドキュメントに、この辺の仕様も明記してもらうか、せめて「動作保証外」でも書いてもらえると嬉しいのですけどねー。
そして、肝心なことを書き忘れてました。
ryoryoさんの目的は、ご提示された最初のコードにおいて event.record['uniqueNum']['disabled']=true; の下の辺りに下記を移動すればシンプルに実現できると思います。
安藤様
本当にご丁寧に有難うございます。
自分自身も早朝から、ご検証頂いた過程を一つ一つ動作を確認してみました。
確かに仰る通り結論としては、最後のeventを処理しているように思われますね。、
PureJavascriptの感覚で言うと異なるスコープでreturnしているのに、返されるeventがスコープのことはる最後のeventというのが非常に馴染まないのですがAPIの仕様がそうと言われればそういうことなのでしょう、、、
いずれにしても私のわがままでとことんお付き合いいただき本当に申し訳ございませんでした。またお詫びとともに
改めて深い御礼を申し上げます。
赤座様もコメントありがとうございます。
宜しくお願い申し上げます。
こちらも曖昧だった点を整理するきっかけになり、勉強になりました!
色々と奥が深いです(笑
現在、同じように複数のイベントハンドラを処理しようとしています。
私がkintone.app.record.setFieldShown('ルックアップ_0', false)をevent.record.ルックアップ_0 == falseに書き換えて実験した結果、
EVENT1.5, EVENT2.5, EVENT3.5 のいずれにおいても、event.record.文字列__1行__0.disabled == true だっただけではなく、
いずれのイベントにおいてもevent.record.ルックアップ_0 == falseでした。(EVENT1.5含む)
これから推察して安藤さんに追記して、以下のことが言えるのではないかなと思っています。
・イベントハンドラにて同じeventオブジェクトを指定した場合、eventオブジェクトは基本的に1つのものをupdateされ使い回される
・console.log表示は、イベントハンドラの処理後に行われる
既出でしたらすいません。