如何为生成的组件创建动态回调

时间:2018-02-19 03:01:12

标签: plotly-dash

我能够理解callbacks dash-table-experiment如何在DataTableapp.layout = Div/Html layout成为callback的一部分。

但是,当DataTable生成为def generate_table(tdf, max_rows=200): return dt.DataTable(rows=tdf.to_dict('records'), columns=tdf.columns, row_selectable=True, filterable=False, sortable=False, selected_row_indices=[], id="datatable-gapminder" ) 并且它不是静态布局的一部分时,如何创建@app.callback( Output('datatable-gapminder', 'selected_row_indices'), [Input('graph-gapminder', 'clickData')], [State('datatable-gapminder', 'selected_row_indices')]) def update_selected_row_indices(clickData, selected_row_indices): if clickData: for point in clickData['points']: if point['pointNumber'] in selected_row_indices: selected_row_indices.remove(point['pointNumber']) else: selected_row_indices.append(point['pointNumber']) return selected_row_indices

Attempting to assign a callback to the
component with the id "datatable-gapminder" but no
components with id "datatable-gapminder" exist in the
app's layout.

如果我说

include Irvine32.inc


.code
main PROC

    mov eax,5
    add  eax,6

    call DumpRegs


    exit

main ENDP
END main

我收到错误

{{1}}

2 个答案:

答案 0 :(得分:2)

您收到该错误,因为标识为datatable-gapminder的组件尚未出现在布局中。

如果要为尚未在布局中的组件创建回调,则必须禁止回调异常。

app.config.supress_callback_exceptions = True

我认为你还需要一个功能来提供布局。默认情况下,Dash应用程序将app.layout存储在内存中。如果将app.layout设置为某个函数,则可以在每个页面加载时提供动态布局。请参阅here

def serve_layout():
    layout = html.Div(
        children=[
            # dt.DataTable()
        ],
    )
    return layout

app.layout = serve_layout

答案 1 :(得分:0)

我不知道,如果目前这一切都可以用破折号完成。但是,您可以考虑创建一个空数据表组件,并简单地更新回调中的所有属性(当然,除了id :))。如果用户不应该在启动时看到空数据表,可以在开头将其设置为隐藏div,并确保它在回调中可见。

如果您决定尝试这种方法,请确保每次调用创建数据表的回调时都返回有意义的值。即使这些值是空的。