我正在使用 dash 和 manitine 组件创建一个网站。为了控制软件包和运行网站,我使用了 poetry。该网站应该有一个 clientside_callback,用于在单击
我正在使用 dash 和 manitine 组件 来创建一个网站。为了控制软件包并运行我正在使用的网站 poetry
。该网站应该有一个 clientside_callback ,用于单击按钮时(使用任何类型的操作,如 alert
or console.log()
查看它是否有效)。我想使用 ClientsideFunction
它来注册回调。
并运行网站 ClientsideFunction
实现回调时 poetry run -m website
我收到错误
TypeError: Cannot read properties of undefined (reading 'showAlert')
at _callee2$ (callbacks.ts:160:40)
at tryCatch (callbacks.ts:2:1)
at Generator.<anonymous> (callbacks.ts:2:1)
at Generator.next (callbacks.ts:2:1)
at asyncGeneratorStep (callbacks.ts:2:1)
at _next (callbacks.ts:2:1)
at callbacks.ts:2:1
at new Promise (<anonymous>)
at callbacks.ts:2:1
at _handleClientside (callbacks.ts:209:2)
showAlert
定义如下 /assets/js/callbacks.js
.
window.dash_clientside = Object.assign({}, window.dash_clientside, {
clientside: {
showAlert: function(n_clicks) {
console.log("this worked!");
return '';
}
}
});
在 callbacks.py
我已经定义的 namespace
并且 function_name
应该存在于一个 js
文件中(即 /assets/js/callbacks.js
)。
from dash import dash, Output, State, Input, callback_context, clientside_callback, ClientsideFunction
def get_callbacks(app):
app.clientside_callback(
ClientsideFunction(
namespace="clientside", # Namespace in the JavaScript file
function_name="showAlert" # Function name defined in the JavaScript file
),
Output('connection_status', 'color'),
Input('vnc_connect', 'n_clicks')
)
这是 __main__.py
服务器获取布局和回调的地方。
import dash_mantine_components as dmc
from dash import Dash, _dash_renderer, html, Input, Output, callback, State
from website.layout import get_layout
from website.callbacks import get_callbacks
_dash_renderer._set_react_version("18.2.0")
app = Dash(assets_ignore=r"(?!callbacks\.js).*") # I only want this file to run
app.layout = get_layout()
get_callbacks(app)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True, port="8000")
这是 layout.py
由三个简单的组件组成的 mantine
.
import dash_mantine_components as dmc
from dash import html
def get_layout():
return dmc.MantineProvider(
[
dmc.Container([
dmc.Badge("Disconnected", variant="dot", color="yellow", id="connection_status"),
dmc.Button("Connect to Server", id="vnc_connect", w=200),
dmc.PasswordInput(label="Server Password", w=200, id="server_password",placeholder="Server password", required=True),
])
]
)
这是我当前的目录结构
poetry.lock
pyproject.toml
website
__init__.py
__main__.py
assets
js
callbacks.js
callbacks.py
layout.py
重新加载页面时,错误并不总是 100% 持续存在,但其持续性足以在客户端造成麻烦。
这个问题 有点相似 。当像这样直接在回调中嵌入 javascript 时,效果会好得多。
def get_callbacks(app):
app.clientside_callback(
"""
function(value) {
alert("asd");
}
""",
Output('connection_status', 'color'),
Input('vnc_connect', 'n_clicks')
)
但是当他 undefined
尝试将 javascriot 放入 js
文件时为什么会出现这种情况却没有答案。
经过一番挖掘,我发现当将 javascript 放入文件中并且它 确实 起作用时,它会在这里被看到,而当它不起作用时,它就不会被看到。
为什么我所需的 js 文件有时会出现,有时却不会出现?我该如何修复它?