Using cb_obj from button.js_on_click()

Hello,

From reading the doc, my understanding was that the variable “cb_obj” could be always used inside a CustomJS to reference the model that triggered the callback.

However, this doesn’t seem the case when used on a button.js_on_click callback:

from bokeh.models import Button, CustomJS
from bokeh.plotting import output_notebook, show

b = Button(label="My button")

cb1 = CustomJS(args={'b': b}, code='console.log("cb1: " + b.label)')
cb2 = CustomJS(args={}, code='console.log("cb2: " + cb_obj.label)') # Gives "undefined"
cb3 = CustomJS(code='console.log("cb3: " + cb_obj.label)') # Gives "undefined"

b.js_on_click(cb1)
b.js_on_click(cb2)
b.js_on_click(cb3)

show(b)

Am I doing something wrong here, or the “js_on_click()” doesn’t support the use of “cb_obj”?

@dabbatelli

The following seems to give access to the label in cb_obj without the requirement for additional arguments. Verified in bokeh 2.3.3.

cb3 = CustomJS(code='console.log("cb3: " + cb_obj.origin.label)')

In my experience, this is definitely different behavior than other JavaScript callbacks such as js_on_change(), where you can access properties from the cb_obj directly. That said, I do not use the JavaScript callbacks very regularly.

For what it is worth, arrived at this by inspecting the object with Object.getOwnPropertyNames(cb_obj)) in the JavaScript console to see what was actually in cb_obj. So, this is all based on experimentation and nothing in the documentation that I could see, so hopefully the developers can comment on if this is expected or not.

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.