6

我能够理解其中的工作是如何callbacks工作的。dash-table-experimentDataTableapp.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.
4

2 回答 2

5

您收到该错误是因为具有 id 的组件datatable-gapminder尚未在布局中。

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

app.config.supress_callback_exceptions = True

我认为您还需要一个功能来服务布局。默认情况下,Dash 应用程序将其存储app.layout在内存中。如果将 app.layout 设置为函数,则可以在每次页面加载时提供动态布局。见这里

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

app.layout = serve_layout
于 2018-04-16T09:50:44.020 回答
0

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

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

于 2018-02-19T16:20:08.220 回答