使用 Gjallarhorn 处理多个命令(来自按钮)的正确方法
A correct way to handle multiple command (from buttons) with Gjallarhorn
window 上有几个按钮,我试图找到处理命令的好方法。
例如:
我必须执行一些操作:
type Action =
|Show
|Open
|Input
|Change
|Statistic
将其翻译成 xaml 将是:
<Button Command="{Binding ShowCommand}" />
<Button Command="{Binding OpenCommand}" />
<Button Command="{Binding InputCommand}" />
<Button Command="{Binding ChangeCommand}" />
<Button Command="{Binding StatisticCommand}" />
稍微玩一下库,我找到了两种不烦人的冗长方法
1。
使用 Observable.merge
Binding.createMessage "StatisticCommand" Statistic source
|> Observable.merge (Binding.createMessage "InputCommand" Input source)
//|> Observable.merge ... and so on
|> Observable.subscribe (performAction model.Value)
|> source.AddDisposable
2。
创建概括消息
type GeneralMessage =
|Perform of Action
|Update of Message
并向上级提升行动讯息
let mainComponent source (model : ISignal<Info>) =
let info = Binding.componentToView source "Info" infoComponent model
//...
let stat = Binding.createMessage "StatCommand" (Perform Statistic) source
let input = Binding.createMessage "InputCommand" (Perform Input) source
//let ...
[info; stat; input; ...]
let appComponent =
let model = initInfo
let update message model =
match message with
|Update message ->
match message with
|...
|Perform action ->
performAction model action
model
Framework.basicApplication model update mainComponent
(好吧,我喜欢第一个选项,因为此操作不会更改模型)
做这些事情是正确的方法(第一个,显而易见的)还是库包含更多拟合函数?
P.S。我找了 Observable.concat [info; stat; input; ...]
但没找到。
所以这里的任何一个选项都可以。我认为适当的方法取决于如何使用它,以及需要什么数据:
如果"Action"是应该由组件整体处理的东西,第一个选项是完全有效的。这将该组件的工作封装在该函数中以设置绑定,并将其完全排除在模型之外。
如果 "Action" 需要模型之外的任何东西(或模型的可用部分),像选项 2 一样向上传播最有意义。这允许模型处理动作,并适当地处理它。
window 上有几个按钮,我试图找到处理命令的好方法。
例如:
我必须执行一些操作:
type Action =
|Show
|Open
|Input
|Change
|Statistic
将其翻译成 xaml 将是:
<Button Command="{Binding ShowCommand}" />
<Button Command="{Binding OpenCommand}" />
<Button Command="{Binding InputCommand}" />
<Button Command="{Binding ChangeCommand}" />
<Button Command="{Binding StatisticCommand}" />
稍微玩一下库,我找到了两种不烦人的冗长方法
1。 使用 Observable.merge
Binding.createMessage "StatisticCommand" Statistic source
|> Observable.merge (Binding.createMessage "InputCommand" Input source)
//|> Observable.merge ... and so on
|> Observable.subscribe (performAction model.Value)
|> source.AddDisposable
2。 创建概括消息
type GeneralMessage =
|Perform of Action
|Update of Message
并向上级提升行动讯息
let mainComponent source (model : ISignal<Info>) =
let info = Binding.componentToView source "Info" infoComponent model
//...
let stat = Binding.createMessage "StatCommand" (Perform Statistic) source
let input = Binding.createMessage "InputCommand" (Perform Input) source
//let ...
[info; stat; input; ...]
let appComponent =
let model = initInfo
let update message model =
match message with
|Update message ->
match message with
|...
|Perform action ->
performAction model action
model
Framework.basicApplication model update mainComponent
(好吧,我喜欢第一个选项,因为此操作不会更改模型)
做这些事情是正确的方法(第一个,显而易见的)还是库包含更多拟合函数?
P.S。我找了 Observable.concat [info; stat; input; ...]
但没找到。
所以这里的任何一个选项都可以。我认为适当的方法取决于如何使用它,以及需要什么数据:
如果"Action"是应该由组件整体处理的东西,第一个选项是完全有效的。这将该组件的工作封装在该函数中以设置绑定,并将其完全排除在模型之外。
如果 "Action" 需要模型之外的任何东西(或模型的可用部分),像选项 2 一样向上传播最有意义。这允许模型处理动作,并适当地处理它。