PlutoUI.jl 中的双向绑定?
Two-way binding in PlutoUI.jl?
我正在尝试做一件简单的(我认为)事情。我想要一个 TextField 和一些绑定到它的变量,并且能够修改这个变量以及 TextField 显示的文本。
我试过了:
@bind x TextField()
print(x)
它工作正常,我在 tex 字段中输入的任何内容都会被打印出来。
现在,如果我想以编程方式更改 x
并将其显示在 TextField 中怎么办?
如果我写 x="trelemorele"
,我得到:
- “x 的多个定义”错误,如果它在单独的单元格中
- 没有错误,但我的 TextField 消失了,如果它在
begin .. end
的同一个单元格中
有什么想法吗?
你试图做的事情从根本上与冥王星的反应不一致。
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
我正在尝试做一件简单的(我认为)事情。我想要一个 TextField 和一些绑定到它的变量,并且能够修改这个变量以及 TextField 显示的文本。
我试过了:
@bind x TextField()
print(x)
它工作正常,我在 tex 字段中输入的任何内容都会被打印出来。
现在,如果我想以编程方式更改 x
并将其显示在 TextField 中怎么办?
如果我写 x="trelemorele"
,我得到:
- “x 的多个定义”错误,如果它在单独的单元格中
- 没有错误,但我的 TextField 消失了,如果它在
begin .. end
的同一个单元格中
有什么想法吗?
你试图做的事情从根本上与冥王星的反应不一致。
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