Elm 埃尔姆:每次都要避免检查

Elm 埃尔姆:每次都要避免检查,elm,Elm,我正在构建一个工作日志应用程序,它首先显示我可以选择的项目列表,然后当选择一个项目时,您将获得一组其他按钮,以记录与所选项目相关的数据 我决定选择一个_项目:例如,在我的模型项目中,Int可能是一个整数id,如果选择project2,它将只填充2 选择项目时出现的按钮向所选项目发送AddMinutes 10等消息,即记录10分钟的工作时间 显然,仅当选择了一个项目时,update函数才会收到这些类型的消息之一,但我仍然必须不断检查所选的项目是否为Just p 有没有办法避免这种情况 我的一个想法

我正在构建一个工作日志应用程序,它首先显示我可以选择的项目列表,然后当选择一个项目时,您将获得一组其他按钮,以记录与所选项目相关的数据

我决定选择一个_项目:例如,在我的模型项目中,Int可能是一个整数id,如果选择project2,它将只填充2

选择项目时出现的按钮向所选项目发送AddMinutes 10等消息,即记录10分钟的工作时间

显然,仅当选择了一个项目时,update函数才会收到这些类型的消息之一,但我仍然必须不断检查所选的项目是否为Just p

有没有办法避免这种情况

我的一个想法是让按钮发送一条包含项目id的消息,例如AddMinutes 2 10,即将10分钟的工作记录到project 2。在某种程度上,这是可行的,但我现在得到了一个复制-model.selected_项目中只有2个和AddMinutes 2。。。按钮发出的消息

使现代化
正如Simon所指出的,反复检查model.selected_项目是否只是一个Just p有其好处:模型与UI保持相对更多的解耦。例如,可能有其他UI方法来更新项目,您可能不需要首先选择项目。

为了避免每次需要函数时都必须检查Maybe,该函数将您置于Maybe包装的值可用的上下文中。这个函数是Maybe.map

在您的情况下,要处理AddMinutes Int消息,只需调用:Maybe.map function whichaddminutes model.selected\u项目

显然,由于您必须生成一个模型,所以还有一点要做,但关键是如果Maybe中的值可用,您可以使用Maybe.map执行操作。为了处理Maybe.Nothing情况,可以使用Maybe.withDefault

说到底,这比使用case表达式好吗?也许,也许不是双关语


就我个人而言,我使用了将ID与消息一起提供的技术,我对结果感到满意。

在未选择任何项目时按下按钮似乎是无效的。如果未选择任何项目,则禁用AddMinutes按钮如何?将项目ID作为AddMinutes消息的一部分似乎不是一个坏主意;您可以让此消息来自其他地方,与此特定UI不耦合。你选择的项目和你正在添加的项目在你当前的UI中恰好是相同的。同意,这也是我的想法。但我还想知道是否有某种方法可以进入另一个“项目已选择”状态,在该状态下,这些按钮存在,并且消息/更新功能知道项目已被明确选择。