This is pretty old, but I’m having the same issue on:
dash==0.36.0
dash-core-components==0.43.0
dash-html-components==0.13.5
dash-renderer==0.18.0
It doesn’t even need to be a multi-file app, here’s a simple stand alone example that’s a small tweak of the https://dash.plot.ly/urls example. The url_fill_page2 is never called even though 'page-2-dropdown.value': {'inputs': [{'id': 'url', 'property': 'pathname'}], 'state': [], 'callback': <function url_fill_page2 at 0x7f9f69db22f0>}
is in the callback_map
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output, State
import flask
app = dash.Dash(
__name__,
external_stylesheets=['https://codepen.io/chriddyp/pen/bWLwgP.css']
)
url_bar_and_content_div = html.Div([
dcc.Location(id='url', refresh=True),
html.Div(id='page-content')
])
layout_index = html.Div([
dcc.Link('Navigate to "/page-1"', href='/page-1'),
html.Br(),
dcc.Link('Navigate to "/page-2"', href='/page-2'),
])
layout_page_1 = html.Div([
html.H2('Page 1'),
dcc.Input(id='input-1-state', type='text', value='Montreal'),
dcc.Input(id='input-2-state', type='text', value='Canada'),
html.Button(id='submit-button', n_clicks=0, children='Submit'),
html.Div(id='output-state'),
html.Br(),
dcc.Link('Navigate to "/"', href='/'),
html.Br(),
dcc.Link('Navigate to "/page-2"', href='/page-2'),
])
layout_page_2 = html.Div([
html.H2('Page 2'),
dcc.Dropdown(
id='page-2-dropdown',
options=[{'label': i, 'value': i} for i in ['LA', 'NYC', 'MTL']],
value='LA'
),
html.Div(id='page-2-display-value'),
html.Br(),
dcc.Link('Navigate to "/"', href='/'),
html.Br(),
dcc.Link('Navigate to "/page-1"', href='/page-1'),
])
def serve_layout():
if flask.has_request_context():
return url_bar_and_content_div
return html.Div([
url_bar_and_content_div,
layout_index,
layout_page_1,
layout_page_2,
])
app.layout = serve_layout
# Index callbacks
@app.callback(Output('page-content', 'children'),
[Input('url', 'pathname')])
def display_page(pathname):
if pathname is not None:
parts = pathname.split('/')
print(parts)
if len(parts) > 1:
if parts[1] == "page-1":
return layout_page_1
elif parts[1] == "page-2":
return layout_page_2
return layout_index
# Page 1 callbacks
@app.callback(Output('output-state', 'children'),
[Input('submit-button', 'n_clicks')],
[State('input-1-state', 'value'),
State('input-2-state', 'value')])
def update_output(n_clicks, input1, input2):
return ('The Button has been pressed {} times,'
'Input 1 is "{}",'
'and Input 2 is "{}"').format(n_clicks, input1, input2)
# Page 2 callbacks
@app.callback(Output('page-2-display-value', 'children'),
[Input('page-2-dropdown', 'value')])
def display_value(value):
print('display_value')
return 'You have selected "{}"'.format(value)
# Page 2 URL callback
@app.callback(Output('page-2-dropdown', 'value'),
[Input('url', 'pathname')])
def url_fill_page2(pathname):
print('page-2-dropdown', pathname)
if pathname is not None:
parts = pathname.split('/')
if len(parts) > 2:
return parts[2]
if __name__ == '__main__':
app.run_server(debug=True)