破折号模式弹出切换代码不起作用

Dash modal popup toggle code isn't working

我在我的 dash 应用程序中使用模式弹出窗口。在布局中,我定义了 2 个按钮。一 Opens 模态和另一个 Closes 它。我参考了文档中的示例并使用了稍微不同的代码来监听每个按钮。

关闭 Modal 后,我想调用一个函数和 运行 其他一些代码行。但是,我似乎听不到关闭按钮的点击。

            # Modal buttons - layout code

            dbc.Button("Add", id="open-btn"),
 
            dbc.Button("Close", id="close-btn")


            # Callbacks
          
             # Modal toggle
             @app.callback(Output("modal-2", "is_open"),
             [
                  Input("open-btn", "n_clicks"),
                  Input("close-btn", "n_clicks")
             ],

             [
                  
                  State("Address", "value"),
                  State("City","value"),
                  State("Zip","value"),
                  State("State","value"),
                  State("modal-2", "is_open")
             ],
             )
            def add_prop(open_btn, close_btn, address, city, zip, state, is_open):

                 if open_btn:

                    return not is_open

                ## This code doesn't work 

                if close_btn:

                   print("Call function")
        
                   append_prop(tenant, industry, address, city, zip, state)

                   return is_open


我想弄清楚为什么关闭弹出代码块不起作用。

发生的事情是 open_btn,它基于该组件的 n_clicks 属性,起始值为 0。当用户单击该按钮时,它会递增并触发回调,open_btn 的值为 1。该道具将保留未来调用您的回调的价值。因此,当关闭按钮触发回调时,open_btn 的值仍然为 1,第一个 if 语句的计算结果为 True.

解决这个问题的方法是 callback_context

def add_prop(open_btn, close_btn, address, city, zip, state, is_open):
    ctx = dash.callback_context

    if not ctx.triggered:
        button_id = 'No clicks yet'
    else:
        button_id = ctx.triggered[0]['prop_id'].split('.')[0]

现在您可以检查 button_id 的值,看看是打开按钮还是关闭按钮导致回调触发,然后执行代码的正确部分。