PlutoUI.jl 中的双向绑定?

Two-way binding in PlutoUI.jl?

我正在尝试做一件简单的(我认为)事情。我想要一个 TextField 和一些绑定到它的变量,并且能够修改这个变量以及 TextField 显示的文本。

我试过了:

@bind x TextField()

print(x)

它工作正常,我在 tex 字段中输入的任何内容都会被打印出来。

现在,如果我想以编程方式更改 x 并将其显示在 TextField 中怎么办?

如果我写 x="trelemorele",我得到:

有什么想法吗?

你试图做的事情从根本上与冥王星的反应不一致。

Pluto 思想的核心是单元格通过依赖关系图连接,Pluto 会根据您编写的代码自动为您计算出该依赖关系图,并使用它来确定哪些单元格需要在何时更新另一个单元格更改,因为它们依赖于更改后的单元格。

简单来说,如果您有:

# Cell 1
x = 1

# Cell 2
y = x^2

Pluto 将确定单元格 2 依赖于单元格 1,因为 x 在那里定义并用作单元格 2 中的输入。但是如果您现在添加

# Cell 3
x = 2

?好吧,你现在已经破坏了反应性——Pluto 无法再计算单元格 2 的结果,因为现在 x 有两个相互竞争的定义。现在你可能会说“好吧,但我已经在单元格 1 中的定义之后将单元格 3 中的定义放在了单元格 3 中,所以很明显它应该使用 x = 2”,但这正是 Pluto 想要避免的。这在 Jupyter notebook 中是可能的——x 的值将取决于 cell 1 还是 cell 3 最后执行,但这意味着笔记本中存在“隐藏状态”;仅查看单元格 1 或单元格 3 是不可能确定它们的定义是否未在其他地方被覆盖。

当你做 @bind x TextField() 时,这与做 x = TextField() 大致相同(实际生成代码有点复杂,但最后它会为变量赋值 x ), 所以在一个单元格中这样做和 x = "trelemorele" 是一回事。

现在关于你的第二点,Pluto 没有抱怨,因为你现在有一个明确的输出,用于在执行你的单元格后应该绑定到 x - 这是对 x 的最后一个分配,这在正常的 Julia 会话中是相同的:

julia> begin
           x = 1
           x = 2
       end;

julia> x
2