複数のスクリプトで様々なイベントを処理していると
同じイベントを扱っているが、先に処理して欲しいスクリプトなどが出てきてしまいます。
そこで、以下のようにスクリプトを分けて作ればわかりやすくイベント内の処理をコントロールできると考えました。
-
イベント実行スクリプト(1つ)
-
処理記述用スクリプト (複数)
1のスクリプトの中に kintone.events.on() を記述しその中で2のスクリプトに記述したメソッドを呼び出していくというものになります。
ただ、2のスクリプトのメソッドを1から呼び出せるようにするためにメソッドを即時関数の中ではなく直で書くことになってしまいます。
グローバルにどんどんメソッドを作っていくことになるわけなのでよろしくないのではないかと思います。
とはいえ他に1のスクリプトから2に書いたメソッドを呼び出す方法がわからないです。
どのような方法が良いのかもしよろしければご教授ください。
tanaka様
お世話になっております。
cstapの江田です。
グローバル汚染を防ぐ方法として、即時関数の利用する方法のほかに、名前空間を利用する方法があります。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript
簡単に言うと、グローバルオブジェクトをひとつだけ用意して、変数や関数をそのグローバルオブジェクトのプロパティとして登録していく方法です。
ただし、そのグローバルオブジェクトについては、他者のコードなどと競合を起こさないように、被らなさそうな名前を付けてあげる必要があります。
なるほど2のスクリプトをクラス化して例えばスクリプト名のグローバル変数を作り、処理はそれに登録していくと。
たしかに汚染も減りますし他からも利用できるのでこの方法は良さそうです。
時間があるときに試してみます!
江田篤史様
お世話になっております。
今さっそく色々調べつつ試しているのですが
今回紹介していただいた方法は全レコードの取得方法で利用されている KintoneRecordManager がそれに当たるという考えであってますでしょうか?
https://developer.cybozu.io/hc/ja/articles/203702800-全レコードの取得方法
これらの情報を参考に作成してみたのですが今1点うまくできないところがあり相談させて頂きたいです。
名前が適当ですが、以下のように作成して
var XXX = (function() {
XXX.prototype.TEST=0
functionXXX() {
}
XXX.prototype.SUMPLE1=function(){
}
XXX.prototype.SUMPLE2=function(){
}
returnXXX
})()
SUMPLE1の中でSUMPLE2を普段呼ぶことはできるのですが、
SUMPLE1の中でリクエストを送信し、結果の中でSUMPLE2を呼び出そうとすると以下のエラーが出て呼び出せません。
Uncaught ReferenceError: replace is not defined
tanaka様
お世話になっております。 返信遅くなって申し訳ございません。
参考になられたページのようにクラス化しても良いですが、今回は単純にクラス化しない方法で例を書きます。
・method1.js
window.MYAPP=window.MYAPP||{};MYAPP.method1=function(){...}
・method2.js
window.MYAPP=window.MYAPP||{};MYAPP.method2=function(){...}
・method3.js
window.MYAPP=window.MYAPP||{};MYAPP.method3=function(){...}
・event.js
(function(){"use strict";kintone.events.on('app.record.index.show',function(event){MYAPP.method1();MYAPP.method2();MYAPP.method3();});})();
また、method1内でmethod2を実行する場合は、
・method1.js
window.MYAPP=window.MYAPP||{};MYAPP.method1=function(){...this.method2();...}
のようになります。
エラーの原因については推察ですが、replaceが定義されないままSUMPLE2内で呼び出されているのではないでしょうか? replaceを定義する場所が正しいか確認してみて下さい。