在本课中,我们将讨论作用域和引用。这些知识将帮助你使规则和操作可重复使用,以便在整个组件中访问和管理数据。
您可以在两个范围内声明规则、操作和数据:
- 步骤:组件的每个步骤都有自己的范围。在此定义的规则、操作和数据在其他地方不可用。
- 工作流:组件的所有步骤都能访问添加到工作流范围的规则、操作和数据。
此外,还有三种范围可用于存储数据:
- 根范围:工作流的所有组件都可以访问根作用域。这可用于在组件之间传递数据。
- 用户会话:只要用户没有注销,即使在完成工作流执行后(例如从另一个工作流内部或多次执行同一工作流时),仍可访问存储在 user_session 作用域中的数据。
- 全局:只要Frontline Workplace 应用程序没有关闭,即使一个用户退出登录,另一个用户登录,也可以访问存储在全局范围内的数据。
示例组件
<workflow [ATTRIBUTES]>
<context> [...] </context> \
<rules> -\
<rule id="menu_button_selection"> --\
<expression>[..]</expression> ---\
<actions> ----\
[...] -----|--> Workflow scope
</actions> ----/
</rule> ---/
</rules> --/
<actions> [...] </actions> -/
<steps>
<step id="stepA" [ATTRIBUTES]>
<context> [...] </context> ----\
<rules> [...] </rules> -----|--> Step scope
<actions> [...] </actions> ----/
<states>
<onevent>
<rule ref="menu_button_selection"/> -------> Referencing a rule from the workflow scope
<rule id="show_notification"> --\
<expression>[..]</expression> ---\
<actions> ----\
[...] -----|--> Direct definition (could still reference a pre-defined action)
</actions> ----/
</rule> ---/
</onevent>
</states>
</step>
<step id="stepB" [ATTRIBUTES]>
<states>
<onevent>
<rule ref="menu_button_selection"/> -------> Referencing a rule from the workflow scope
</onevent>
</states>
</step>
</steps>
</workflow>
在这个例子中
- 在工作流作用域中定义了
id="menu_button_selection"
的规则,然后使用ref
属性在步骤id="stepA
" 和步骤id="stepB"
中引用该规则。
注:重复使用规则和操作可使组件的行为保持一致,提高可维护性,并最大限度地减少代码量。
- 作用域中的 ID 必须是唯一的。您可以在其他作用域中使用相同的 ID,但除非您有非常充分的理由,否则我们建议您不要这样做,以免造成混淆。如果使用相同的 ID,则优先顺序是自下而上的:如果在步骤作用域中直接定义了
id="menu_button_selection"
的规则,则将执行该规则,而不是工作流作用域中任何具有相同 ID 的预定义规则。 - 您也可能有一些规则/操作只在其中一个步骤中需要,但在该特定步骤的多个状态/规则中都需要。在这种情况下,您可以在步骤作用域中定义规则/操作,并以同样的方式引用它。
- 最后,您还可以在需要的地方直接定义规则和操作。这样的规则/操作不会在其他地方出现。如果您知道您的规则/操作不会被重复使用,直接定义可以使组件更加清晰,因为您不必跳来跳去地查看其实现。
注意:ID 在作用域内必须是唯一的。如果您在创建新规则或操作时复制并粘贴现有规则或操作作为模板,一个典型的错误就是忘记更改 ID 属性。请养成先更改 ID 的习惯。
任务
重构我们的选择组件:
- 将
finish_workflow
操作放入全局作用域,并在规则中引用它。 - 将
menu_button_selection
规则放入全局作用域,并在步骤中引用它。 - 确保组件仍能正常工作。
下载组件(作业前)
帮助和资源
先决条件
在开始第一项实践任务之前,您需要访问Frontline Command Center (FCC)。
- 用户应具有 "创建者 "和 "开发者 "角色。
- 您需要一个与 FCC 连接的设备来进行测试。
- 用户设备还应具有 "开发者 "角色。
有关详细信息,请参阅安装指南中的 "先决条件 "部分。
这里有一些小贴士,可以让工作流程和组件的开发变得更容易一些:
预览模式
如果用户具有 "开发人员 "角色,则可以使用预览模式功能。通过该模式,您可以立即测试更改,而无需发布工作流程。您可以通过两种方式使用预览模式:
- 登录设备并选择主菜单中的预览模式。设备现在应显示 "等待服务器"。
- 在Frontline Creator 中,选择保存工作流程图标右侧的调试设备,然后按播放按钮或"Alt + P"。您也可以在组件编辑器中使用热键 "Alt + p"。
工作流程的当前状态将被保存并发送到设备。您可以临时更改开始转换,以便只测试工作流程的特定组件。
翻转器
设置一个调试工具非常有用,这样就可以在执行工作流程的同时访问设备日志。Flipper就是这样一款工具。
服务器和客户端日志
您可以使用 sysadmin 用户登录或直接访问 UBIMAX_HOME\logs 文件夹来访问 FCC 和设备日志。设备日志会定期推送到服务器,但您可以以系统管理员用户身份请求立即上传。
解决方案说明
如果您还没有为开发做好一切准备,这应该是第一次实践任务的主要任务。
值得注意的是,在规则定义中,您现在引用的是在同一作用域中定义的预定义操作。<actions>和
<rules>
标签的顺序对于实现这一功能并不重要。您的组件应该是这样的
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<workflow xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" wfd_version="1.0" reporting="false"
id="choice" name="choice" descriptor="Choice component" startstep="choose"
xsi:noNamespaceSchemaLocation="../../../configuration/workflow.xsd">
<rules>
<rule id="menu_button_selection">
<expression>#{event:command} == 'APPLE' || #{event:command} == 'PEAR'</expression>
<actions>
<action ref="finish_workflow"/>
</actions>
</rule>
</rules>
<actions>
<finish_workflow id="finish_workflow">
<output>
<param name="selected_button" type="string">#{event:command}</param>
</output>
</finish_workflow>
</actions>
<steps>
<step id="choose" descriptor="the user selects between two options" uitemplate="ChoiceScreen">
<states>
<onevent>
<rule ref="menu_button_selection"/>
</onevent>
</states>
</step>
</steps>
</workflow>
下载组件(作业后)
至此,第二课结束。下一课将学习数据变量。