昨日,ボタンの要素分類名を置換した時に上手く事象処理が出来ないという問題に少し時間を取られたが,事象と委譲元の1つの組み合わせには1つの聴取子をあて,聴取子内で処理を分けることにしていったん解決した。
この問題は,以下のように,同一要素を指す .foo
,.bar
の発泡事象を祖先要素 prn
に委譲した場合に起こる。
prn.on_clk( '.foo', fn_foo )
.on_clk( '.bar', fn_bar );
この時,fn_foo()
内で .foo
を .bar
に(遅延なく)置換すると,.bar
の click
事象向け聴取子も実行されてしまう(恐らくは発泡を捕捉した時点での分類名だから?)。似たような問題は以前にもあったが,未解決だった(希哲14年10月27日16歩)。
最初は不可解な現象だったが,だんだん Aejs の事象委譲に原因があることが分かってきた。ただ,久しぶりに @tgt_evt.bld..on()
を読み直したものの,目立った論理的欠陥は無かった。捕捉した事象の判定をしているだけの単純な仕組みなので,同一事象・同一要素に対して聴取子を分ける使い方自体が問題のような気がしてきた。大張りを考えると余計な処理も加えたくない。
そろそろ @tgt_evt.bld..off()
を追加してもいい頃だが,とりあえずは以下のように書き換えておくことにした。
prn.on_clk( '.foo, .bar', fn ( evt )
{
if ( evt.tgt().b( '.foo' ) ) {
// .foo 向け処理
} else {
// .bar 向け処理
}
} );