chainAPI
chainAPI
はメソッドチェーンを用いて、自然言語的に JS プラグインを記述できるように設計された API です。
ScreenクラスのeventHook内で、useChainAPI
関数から利用することができます。
esmJSPlugin.screen.sheetSave("schedule").onEntered(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
this.useChainAPI(function (chainAPI) {
chainAPI
.onUpdated(memoItem) // メモ項目の値が更新されたとき
.setLabel(`メモ(${memoItem.length}文字)`) // ラベルを「`メモ(${memoItem.length}文字)`」に設定する
.ifLengthIsGreaterThan(50) // もしメモ項目の文字数が50より大きければ
.setLabelColor("red") // ラベルの色を赤色にする
.else() // そうでなければ
.setLabelColor(null); // ラベルの色をデフォルトの色にする
});
});
基本概念
チェーン
chainAPI
キーワードから始まる、メソッドチェーンで記述された一綴りの処理を JS プラグインではチェーン
と呼びます。
esmJSPlugin.screen.sheetSave("schedule").onEntered(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
this.useChainAPI(function (chainAPI) {
// チェーン1
chainAPI.onMounted(memotItem).setLabel(`メモ(${memoItem.length}文字)`);
// チェーン2
chainAPI
.onUpdated(memoItem)
.setLabel(`メモ(${memoItem.length}文字)`)
.ifLengthIsGreaterThan(50) // メモ項目の文字数が50より大きい場合
.setLabelColor("red"); // ラベルの色を赤色にする
});
});
シンタックス
前出の例では、chainAPI
に対してon
やif
、set
といった接頭辞で始まるメソッドを呼び出しているように見えますが、実際にchainAPI
にこれらのメソッドがあるわけではなく、指定した対象のメソッド呼び出しを仲介しています。
これらのキーワードを JS プラグインでは便宜上シンタックス
と呼びます。
例えば前出の例では、on
シンタックスを利用してmemoItem
のonMounted
メソッドを呼び出しています。
また、if
シンタックスを利用してmemoItem
のlengthIsGreaterThan
メソッドを呼び出しています。
例の中ではifLengthIsGreaterThan(50)
と記述されているので、memoItem
を対象として指定していませんが、on
シンタックスをはじめとするいくつかのシンタックスは、それ以後に記述される各シンタックスでの対象の指定を省略させることができます。
ブロック
チェーン
は後述の、on
およびonEach
シンタックスの以前・以後で分けられます。分けられたそれぞれを JS プラグインではブロック
と呼びます。on
およびonEach
シンタックスはチェーン
内でいずれかを一度しか利用できないので、チェーン
内のブロック
数は最大 2 となります。
esmJSPlugin.screen.sheetSave("schedule").onEntered(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
this.useChainAPI(function (chainAPI) {
chainAPI
// ブロック1
.do(function () {
console.log("do something");
})
.onMounted(memotItem)
// ブロック2
.setLabel(`メモ(${memoItem.length}文字)`);
});
});
on
およびonEach
シンタックス以前のブロック
は、式の評価時点で即時実行されます。以後のブロック
は、on
およびonEach
メソッドの対象となるイベントが発生したタイミングで実行されます。
上記の例をchainAPI
を使わずに書き下すと、以下のようになります。
esmJSPlugin.screen.sheetSave("schedule").onEntered(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
console.log("do something"); // ブロック1に該当
memoItem.onMounted(function () {
memoItem.setLabel(`メモ(${memoItem.length}文字)`); // ブロック2に該当
});
});
利用可能シンタックス
on
on
シンタックスは第一引数にTargetインスタンスをとり、処理の対象とします。
対象となるTargetインスタンスが持つ、on
から始まるメソッド名を記述することで、対象インスタンスのメソッドを実行し、eventHookを登録します。on
シンタックス以後に記述された処理がイベント発生時に実行されるコールバック関数として登録されます。
第二引数以降は、メソッドの第二引数以降にマッピングされます。
チェーン
内でon
シンタックス以後に記述された各シンタックスは、第一引数での対象の指定がされなかった場合、on
シンタックスで指定された対象を処理の対象として扱います。
また、do
やif
等の単一のコールバック関数を受け取るシンタックスの場合は、同じく、on
シンタックスで指定された対象がコールバック関数の引数として渡されます。
esmJSPlugin.screen.sheetSave("schedule").onEntered(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
this.useChainAPI(function (chainAPI) {
// メモ項目が初期化されたときに、ラベルの色を赤にする
chainAPI
.onMounted(memoItem)
.setLabelColor("red");
});
});
上記の例をchainAPI
を使わずに書き下すと、以下のようになります。
esmJSPlugin.screen.sheetSave("schedule").onEntered(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
memoItem.onMounted(function () {
// メモ項目が初期化されたときに、ラベルの色を赤にする
memoItem.setLabelColor("red");
});
});
Important
on
シンタックスは第一引数に必ずTargetインスタンスを指定する必要があります。on
シンタックスおよびonEach
シンタックス(後述)はチェーン
内でいずれかを一度しか使用できません。
onEach
onEach
シンタックスは第一引数にTargetsインスタンスをとり、処理の対象とします。
対象となるTargetsインスタンスが内包するTargetインスタンスが持つ、on
から始まるメソッド名を記述することで、それぞれのTargetインスタンスに対してメソッドを実行し、eventHookを登録します。onEach
シンタックス以後に記述された処理がイベント発生時に実行されるコールバック関数として登録されます。
第二引数以降は、メソッドの第二引数以降にマッピングされます。
チェーン
内でonEach
シンタックス以後に記述された各シンタックスは、第一引数での対象の指定がされなかった場合、onEach
シンタックスで指定されたTargetsインスタンスが内包する各Targetインスタンスを処理の対象として扱います。
また、do
やif
等の単一のコールバック関数を受け取るシンタックスの場合は、同じく、onEach
シンタックスで指定されたTargetsインスタンスが内包する各Targetインスタンスがコールバック関数の引数として渡されます。
esmJSPlugin.screen.sheetSave("schedule").onEntered(function (screen) {
const sheetItems = screen.getSheetItems();
this.useChainAPI(function (chainAPI) {
// 値が変更された項目のラベルを赤色に変更する
chainAPI
.onEachUpdated(sheetItems)
.setLabelColor("red");
});
});
上記の例をchainAPI
を使わずに書き下すと、以下のようになります。
esmJSPlugin.screen.sheetSave("schedule").onEntered(function (screen) {
const sheetItems = screen.getSheetItems();
// eventHook登録済みの項目インスタンスを保持
const registeredHooks = [];
sheetItems.onMounted(function () {
// 初期化時に表示されている項目のeventHook登録
sheetItems.entities.forEach(function (sheetItem) {
const unregister = sheetItem.onUpdated(function () {
sheetItem.setLabelColor("red");
});
registeredHooks.push({ item: sheetItem, unregister });
});
});
sheetItems.onUpdated(function () {
// 表示項目の変更によって不要になったeventHookの解除
const deletedHooks = registeredHooks.filter(function ({ item }) {
return !sheetItems.entities.includes(item);
});
deletedHooks.forEach(function ({ unregister }) {
unregister();
});
registeredHooks = registeredHooks.filter(function (hook) {
return !deletedHooks.includes(hook);
});
// 表示項目の変更によって追加された項目のeventHook登録
const registeredItems = registeredHooks.map(function ({ item }) {
return item;
});
const addedItems = sheetItems.entities.filter(function (sheetItem) {
return !registeredItems.includes(sheetItem);
});
addedItems.forEach(function (addedItem) {
const unregister = addedItem.onUpdated(function () {
addedItem.setLabelColor("red");
});
registeredHooks.push({ item: addedItem, unregister });
});
});
});
Important
onEach
シンタックスは第一引数に必ずTargetsインスタンスを指定する必要があります。on
シンタックス(前述)およびonEach
シンタックスはチェーン
内でいずれかを一度しか使用できません。
do
do
シンタックスはコールバック関数を引数にとり、実行します。on
またはonEach
シンタックス以後にdo
シンタックスが記述されている場合、コールバック関数の引数にはon
またはonEach
シンタックスで束縛されたTargetインスタンスが渡されます。
esmJSPlugin.screen.sheetSave("schedule").onEntered(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
this.useChainAPI(function (chainAPI) {
chainAPI.do(function () {
console.log("do something");
});
// メモ項目の値が更新されたときに、ラベルを出力
chainAPI
.onUpdated(memoItem)
.do(function (item) {
console.log(item.label);
});
});
});
上記の例をchainAPI
を使わずに書き下すと、以下のようになります。
esmJSPlugin.screen.sheetSave("schedule").onEntered(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
console.log("do something");
memoItem.onUpdated(function () {
// メモ項目の値が更新されたときに、ラベルを出力
console.log(memoItem.label);
});
});
set
set
シンタックスは第一引数にTargetインスタンスをとり、処理の対象とします。
対象となるTargetインスタンスが持つ、set
から始まるメソッド名を記述することで、対象インスタンスのメソッドを実行します。
対象以降の引数は、実行メソッドの引数にマッピングされます。
esmJSPlugin.screen.sheetUpdate("schedule").onSheetItemsMounted(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
this.useChainAPI(function (chainAPI) {
chainAPI
.setLabel(memoItem, `メモ(${memoItem.length}文字)`);
chainAPI
.onUpdated(memoItem)
.setLabel(`メモ(${memoItem.length}文字)`); // onの対象と同じ場合、setシンタックスの対象の指定は省略可能
});
});
上記の例をchainAPI
を使わずに書き下すと、以下のようになります。
esmJSPlugin.screen.sheetUpdate("schedule").onSheetItemsMounted(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
memoItem.setLabel(`メモ(${memoItem.length}文字)`);
unregister = memoItem.onUpdated(function () {
memoItem.setLabel(`メモ(${memoItem.length}文字)`);
});
});
if
if
シンタックスは第一引数にTargetインスタンスをとり、処理の対象とします。
対象となるTargetインスタンスが持つ、返値として真偽値を返すメソッドに接頭辞としてif
を付与して記述することで、対象インスタンスのメソッドを実行し、後に続く処理を条件付きで実行することができます。
対象以降の引数は、実行メソッドの引数にマッピングされます。
esmJSPlugin.screen.sheetUpdate("schedule").onSheetItemsMounted(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
this.useChainAPI(function (chainAPI) {
chainAPI.ifLengthIsGreaterThanOrEqual(memoItem, 50).do(function () {
console.log("50文字以上");
});
chainAPI
.onUpdated(memoItem)
.ifLengthIsLessThan(50) // onの対象と同じ場合、ifシンタックス対象の指定は省略可能
.do(function () {
console.log("50文字未満");
});
});
});
上記の例をchainAPI
を使わずに書き下すと、以下のようになります。
esmJSPlugin.screen.sheetUpdate("schedule").onSheetItemsMounted(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
if (memoItem.lengthIsGreaterThanOrEqual(50)) {
console.log("50文字以上");
}
unregister = memoItem.onUpdated(function () {
if (memoItem.lengthIsLessThan(50)) {
console.log("50文字未満");
}
});
});
また、if
シンタックスは対象を指定せず、真偽値を返す任意のコールバック関数を引数とすることもできます。
このとき、on
またはonEach
シンタックス以後にif
シンタックスが記述されている場合、コールバック関数の引数にはon
またはonEach
シンタックスで束縛されたTargetインスタンスが渡されます。
esmJSPlugin.screen.sheetUpdate("schedule").onEntered(function (screen) {
const sheetItems = screen.getSheetItems();
this.useChainAPI(function (chainAPI) {
chainAPI
// コールバック関数を利用
.if(function () {
return true;
})
.do(function () {
console.log("do something");
});
chainAPI
.onEachMounted(sheetItems)
// コールバック関数を利用
// 引数にはonEachMountedで指定したTargetsインスタンスの各要素が渡される
.if(function (sheetItem) {
return sheetItem.label.includes("substring");
})
.do(function () {
console.log("do something");
});
});
});
Important
if
シンタックスはブロック
内で一度しか使用できません。
elseif
elseif
シンタックスは第一引数にTargetインスタンスをとり、処理の対象とします。
対象となるTargetインスタンスが持つ、返値として真偽値を返すメソッドに接頭辞としてelseif
を付与して記述することで、対象インスタンスのメソッドを実行します。ブロック
内のこれ以前に記述されたif
やelseif
シンタックスの条件を満たさず、かつ、このシンタックスで指定された条件を満たす場合にのみ、後に続く処理を実行することができます。ブロック
内で、if
シンタックス以後にしか記述できません。また、else
シンタックス以後には記述できません。
対象以降の引数は、実行メソッドの引数にマッピングされます。
esmJSPlugin.screen.sheetUpdate("schedule").onSheetItemsMounted(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
this.useChainAPI(function (chainAPI) {
chainAPI
.ifLengthIsGreaterThanOrEqual(memoItem, 50)
.do(function () {
console.log("50文字以上");
})
.elseifLengthIsGreaterThanOrEqual(memoItem, 40)
.do(function () {
console.log("40文字以上");
});
chainAPI
.onUpdated(memoItem)
.ifLengthIsLessThan(50)
.do(function () {
console.log("50文字未満");
})
.elseifLengthIsLessThan(60) // onの対象と同じ場合、elseifシンタックスの対象の指定は省略可能
.do(function () {
console.log("60文字未満");
});
});
});
上記の例をchainAPI
を使わずに書き下すと、以下のようになります。
esmJSPlugin.screen.sheetUpdate("schedule").onSheetItemsMounted(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
if (memoItem.lengthIsGreaterThanOrEqual(50)) {
console.log("50文字以上");
} else if (memoItem.lengthIsGreaterThanOrEqual(40)) {
console.log("40文字以上");
}
unregister = memoItem.onUpdated(function () {
if (memoItem.lengthIsLessThan(50)) {
console.log("50文字未満");
} else if (memoItem.lengthIsLessThan(60)) {
console.log("60文字未満");
}
});
});
また、elseif
シンタックスは対象を指定せず、真偽値を返す任意のコールバック関数を引数とすることもできます。
このとき、on
またはonEach
シンタックス以後にelseif
シンタックスが記述されている場合、コールバック関数の引数にはon
またはonEach
シンタックスで束縛されたTargetインスタンスが渡されます。
esmJSPlugin.screen.sheetUpdate("schedule").onEntered(function (screen) {
const sheetItems = screen.getSheetItems();
this.useChainAPI(function (chainAPI) {
chainAPI
.if(function () {
return false;
})
.do(function () {
console.log("do something");
})
// コールバック関数を利用
.elseif(function () {
return true;
})
.do(function () {
console.log("do something else");
});
chainAPI
.onEachMounted(sheetItems)
.if(function () {
return false;
})
.do(function () {
console.log("do something");
})
// コールバック関数を利用
// 引数にはonEachMountedで指定したTargetsインスタンスの各要素が渡される
.elseif(function (sheetItem) {
return sheetItem.label.includes("substring");
})
.do(function () {
console.log("do something else");
});
});
});
else
else
シンタックスは引数をとりません。ブロック
内のこれ以前に記述されたif
やelseif
シンタックスの条件を満たさなかった場合にのみ、後に続く処理を実行することができます。ブロック
内で、if
シンタックス以後にしか記述できません。
esmJSPlugin.screen.sheetSave("schedule").onEntered(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
this.useChainAPI(function (chainAPI) {
chainAPI
.onUpdated(memoItem)
.ifLengthIsGreaterThan(50)
.setLabelColor("red")
.else()
.setLabelColor(null);
});
});
上記の例をchainAPI
を使わずに書き下すと、以下のようになります。
esmJSPlugin.screen.sheetSave("schedule").onEntered(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
memoItem.onUpdated(function () {
if (memoItem.lengthIsGreaterThan(50)) {
memoItem.setLabelColor("red");
} else {
memoItem.setLabelColor(null);
}
});
});
Important
else
シンタックスはブロック
内で一度しか使用できません。
or
or
シンタックスは第一引数にTargetインスタンスをとり、処理の対象とします。
対象となるTargetインスタンスが持つ、返値として真偽値を返すメソッドに接頭辞としてor
を付与して記述することで、対象インスタンスのメソッドを実行します。ブロック
内の直前に記述されたif
やelseif
、or
、and
シンタックスとの論理和をとって、条件を満たす場合にのみ後に続く処理を実行することができます。
対象以降の引数は、実行メソッドの引数にマッピングされます。
esmJSPlugin.screen.sheetUpdate("schedule").onSheetItemsMounted(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
this.useChainAPI(function (chainAPI) {
chainAPI
.ifLengthIsGreaterThanOrEqual(memoItem, 50)
.orLengthIsLessThanOrEqual(memoItem, 40)
.do(function () {
console.log("50文字以上または40文字以下");
});
chainAPI
.onUpdated(memoItem)
.ifLengthIsGreaterThanOrEqual(50)
.orLengthIsLessThanOrEqual(40) // onの対象と同じ場合、ifシンタックス対象の指定は省略可能
.do(function () {
console.log("50文字以上または40文字以下");
});
});
});
上記の例をchainAPI
を使わずに書き下すと、以下のようになります。
esmJSPlugin.screen.sheetUpdate("schedule").onSheetItemsMounted(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
if (memoItem.lengthIsGreaterThanOrEqual(50) || memoItem.lengthIsLessThanOrEqual(40)) {
console.log("50文字以上または40文字以下");
}
unregister = memoItem.onUpdated(function () {
if (memoItem.lengthIsGreaterThanOrEqual(50) || memoItem.lengthIsLessThanOrEqual(40)) {
console.log("50文字以上または40文字以下");
}
});
});
また、or
シンタックスは対象を指定せず、真偽値を返す任意のコールバック関数を引数とすることもできます。
このとき、on
またはonEach
シンタックス以後にor
シンタックスが記述されている場合、コールバック関数の引数にはon
またはonEach
シンタックスで束縛されたTargetインスタンスが渡されます。
esmJSPlugin.screen.sheetUpdate("schedule").onEntered(function (screen) {
const sheetItems = screen.getSheetItems();
this.useChainAPI(function (chainAPI) {
chainAPI
.if(function () {
return false;
})
// コールバック関数を利用
.or(function () {
return true;
})
.do(function () {
console.log("do something");
});
chainAPI
.onEachMounted(sheetItems)
.if(function () {
return false;
})
// コールバック関数を利用
// 引数にはonEachMountedで指定したTargetsインスタンスの各要素が渡される
.or(function (sheetItem) {
return sheetItem.label.includes("substring");
})
.do(function () {
console.log("do something");
});
});
});
and
and
シンタックスは第一引数にTargetインスタンスをとり、処理の対象とします。
対象となるTargetインスタンスが持つ、返値として真偽値を返すメソッドに接頭辞としてand
を付与して記述することで、対象インスタンスのメソッドを実行します。ブロック
内の直前に記述されたif
やelseif
、or
、and
シンタックスとの論理積をとって、条件を満たす場合にのみ後に続く処理を実行することができます。
対象以降の引数は、実行メソッドの引数にマッピングされます。
esmJSPlugin.screen.sheetUpdate("schedule").onSheetItemsMounted(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
this.useChainAPI(function (chainAPI) {
chainAPI
.ifLengthIsGreaterThanOrEqual(memoItem, 50)
.andLengthIsLessThanOrEqual(memoItem, 60)
.do(function () {
console.log("50文字以上かつ60文字以下");
});
chainAPI
.onUpdated(memoItem)
.ifLengthIsGreaterThanOrEqual(50)
.andLengthIsLessThanOrEqual(60) // onの対象と同じ場合、ifシンタックス対象の指定は省略可能
.do(function () {
console.log("50文字以上かつ60文字以下");
});
});
});
上記の例をchainAPI
を使わずに書き下すと、以下のようになります。
esmJSPlugin.screen.sheetUpdate("schedule").onSheetItemsMounted(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
if (memoItem.lengthIsGreaterThanOrEqual(50) && memoItem.lengthIsLessThanOrEqual(60)) {
console.log("50文字以上かつ60文字以下");
}
memoItem.onUpdated(function () {
if (memoItem.lengthIsGreaterThanOrEqual(50) && memoItem.lengthIsLessThanOrEqual(60)) {
console.log("50文字以上かつ60文字以下");
}
});
});
また、and
シンタックスは対象を指定せず、真偽値を返す任意のコールバック関数を引数とすることもできます。
このとき、on
またはonEach
シンタックス以後にand
シンタックスが記述されている場合、コールバック関数の引数にはon
またはonEach
シンタックスで束縛されたTargetインスタンスが渡されます。
esmJSPlugin.screen.sheetUpdate("schedule").onEntered(function (screen) {
const sheetItems = screen.getSheetItems();
this.useChainAPI(function (chainAPI) {
chainAPI
.if(function () {
return true;
})
// コールバック関数を利用
.and(function () {
return true;
})
.do(function () {
console.log("do something");
});
chainAPI
.onEachMounted(sheetItems)
.if(function () {
return true;
})
// コールバック関数を利用
// 引数にはonEachMountedで指定したTargetsインスタンスの各要素が渡される
.and(function (sheetItem) {
return sheetItem.label.includes("substring");
})
.do(function () {
console.log("do something");
});
});
});
not
not
シンタックスはif
やelseif
、or
、and
シンタックスとあわせて利用します。if
やelseif
、or
、and
の後にNot
を付与して記述することで、指定された条件を満たさない場合にのみ、後に続く処理を実行することができます。
esmJSPlugin.screen.sheetUpdate("schedule").onSheetItemsMounted(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
this.useChainAPI(function (chainAPI) {
chainAPI
.ifNotLengthIsGreaterThanOrEqual(memoItem, 50)
.do(function () {
console.log("50文字未満");
});
chainAPI
.ifLengthIsGreaterThanOrEqual(memoItem, 50)
.andNotLengthIsGreaterThan(memoItem, 60)
.do(function () {
console.log("50文字以上かつ60文字以下");
});
});
});
上記の例をchainAPI
を使わずに書き下すと、以下のようになります。
esmJSPlugin.screen.sheetUpdate("schedule").onSheetItemsMounted(function (screen) {
const memoItem = screen.getSheetItem("calendar.schedule.memo");
if (!memoItem.lengthIsGreaterThanOrEqual(50)) {
console.log("50文字未満");
}
if (memoItem.lengthIsGreaterThanOrEqual(50) && !memoItem.lengthIsGreaterThan(60)) {
console.log("50文字以上かつ60文字以下");
}
});
each
each
シンタックスは引数にTargetsインスタンスをとります。
指定したTargetsインスタンスが内包する各Targetインスタンスが、ブロック内のeach
シンタックス以後のシンタックスの処理の対象となります。 また、do
やif
等の単一のコールバック関数を受け取るシンタックスの場合は、同じく、onEach
シンタックスで指定されたTargetsインスタンスが内包する各Targetインスタンスがコールバック関数の引数として渡されます。
esmJSPlugin.screen.sheetSave("businessplan").onSheetItemsMounted(function (screen) {
const sheetItems = screen.getSheetItems();
this.useChainAPI(function (chainAPI) {
chainAPI
.each(sheetItems)
.do(function (sheetItem) {
console.log(sheetItem.label);
})
// 業務タイプ切り替え等により表示項目が切り替わるたびに、表示されている全ての項目のラベルを出力する
.onUpdated(sheetItems)
.each(sheetItems)
.do(function (sheetItem) {
console.log(sheetItem.label);
});
});
});
上記の例をchainAPI
を使わずに書き下すと、以下のようになります。
esmJSPlugin.screen.sheetSave("businessplan").onSheetItemsMounted(function (screen) {
const sheetItems = screen.getSheetItems();
sheetItems.entities.forEach(function (sheetItem) {
console.log(sheetItem.label);
});
sheetItems.onUpdated(function () {
sheetItems.entities.forEach(function () {
console.log(sheetItem.label);
})
})
});
Important
each
シンタックスはブロック
内で一度しか使用できませんeach
シンタックスはonEach
シンタックスの後に使用することはできません。
eventHook のクリーンアップ
画面に遷移してから離れるまでに複数回発生するようなイベントに対して、ScreenインスタンスのeventHookを登録する場合などは、適切なクリーンアップ処理が必要でした。chainAPI
では、ScreenインスタンスのeventHookが実行されるたびに、chainAPI
によって登録されたeventHookが自動的に解除されるのでクリーンアップ処理は不要です。
let unregister;
// 顧客タイプの切り替えによって表示する項目が変更されるたびに実行される
esmJSPlugin.screen.sheetSave("customer").onSheetItemsUpdated(function (screen) {
// 前回のonSheetItemsUpdatedで登録されたcustomerNameItemに対するeventHookがあれば解除
if (unregister) {
unregister();
}
const customerNameItem = screen.getSheetItemByLabel("顧客名");
unregister = customerNameItem.onMounted(function () {
// 顧客登録変更画面で、顧客名項目初期化時に値を出力する
console.log(customerNameItem.value);
});
});
chainAPI
を利用しない上記の例では、クリーンアップ処理が必要でした。
// 顧客タイプの切り替えによって表示する項目が変更されるたびに実行される
esmJSPlugin.screen.sheetSave("customer").onSheetItemsUpdated(function (screen) {
const customerNameItem = screen.getSheetItemByLabel("顧客名");
this.useChainAPI(function (chainAPI) {
chainAPI.onMounted(customerNameItem).do(function () {
// 顧客登録変更画面で、顧客名項目初期化時に値を出力する
console.log(customerNameItem.value);
});
});
});
chainAPI
では、onSheetItemsUpdated
のコールバック関数を実行されるたびに、前回実行時にchainAPI
により登録されたcustomerNameItem
のeventHookが自動的に解除されるため、クリーンアップ処理は不要です。