Боке: ссылка Выбор виджета в CustomJS Callback - PullRequest
0 голосов
/ 15 мая 2019

Я хочу иметь возможность ссылаться 2 Выберите виджеты (select1.value и select2.value) в обратном вызове CustomJS, поэтому я не могу использовать cb_obj.value.

select1 = Select(title="Level:", options=['All Levels', '1', '2', '3'], callback=callback)

Сначала я попытался ссылаться на его значение непосредственно в обратном вызове:

callback = CustomJS(args=dict(source=source, ts=true_source), code="""
var f = select1.value

Это привело к ошибке: select1 не определено:

    Uncaught ReferenceError: select1 is not defined
    at eval (eval at get (bokeh-1.1.0.min.js:31), <anonymous>:9:11)
    at i.execute (bokeh-1.1.0.min.js:31)
    at e.change_input (bokeh-widgets-1.1.0.min.js:31)
    at e.change_input (bokeh-widgets-1.1.0.min.js:31)
    at HTMLSelectElement.<anonymous> (bokeh-widgets-1.1.0.min.js:31)

ЗатемЯ попытался передать select1 аргументам в обратном вызове:

 callback = CustomJS(args=dict(source=source, ts=true_source, select1=select1), code="""
    var f = select1.value

Поскольку аргумент select1 равен callback=callback, если я определяю select1 до того, как я определю callback, python собираетсясгенерировать ошибку, потому что callback был указан перед присваиванием.И наоборот, если я определю callback перед выбранным виджетом.

Итак, я попробовал это: определение select1 дважды

select1 = ... (without the callback argument)
callback = ...
select1 = ... (with the callback argument)

Это, наконец, сгенерировало диаграмму боке.Но когда я щелкнул по виджету выбора, значения не осталось.

var f=select1.value;
console.log('Select1 type ' + f.constructor.name.toLowerCase()); // string, as expected
console.log('Value ' + f); // outputs 'Value ', so f is nothing
console.log('Select1 options ' + select1.options); // Output is as expected

select1.value было бы не пустым, если я предоставлю аргумент значения по умолчанию для select1:

select1 = Select(title="Level:", value='1', options=['All Levels', '1', '2', '3'], callback=callback)

Но тогда select1.value останется '1', независимо от того, на что я изменю фактическое значение виджета.Таким образом, значение не обновляется вообще.

Я ценю помощь .. спасибо!

1 Ответ

0 голосов
/ 15 мая 2019

Я наконец получил его на работу. Я использовал js_on_change вместо добавления callback в качестве аргумента виджета.

В функции обратного вызова я передал имена виджетов в качестве аргументов.

1) Определить выбранные виджеты, необходимые для указания значения по умолчанию

select1 = Select(title="Level:", value='All Levels', options=['All Levels', '1', '2', '3'])
select2 = Select(...)

2) Определить обратный вызов, явно передать виджеты в качестве аргументов

callback = CustomJS(args=dict(source=source, ts=true_source, select1=select1, select2=select2), code="""
f = select1.value
g = select2.value
"""

3) js_on_change

select1.js_on_change('value', callback)
...