Mingcedar

所属产品: Mingcedar Studio DESIGNER

脚本作用域与参数传递 | Mingcedar Studio

说明脚本作用域、执行限制,以及页面导航和弹窗的参数发送、读取、类型转换与排错。

首次发布 最近更新

<div class="manual-doc-article manual-doc-article-section"><h2 id="script-scope-and-parameter-passing">功能: 脚本作用域与参数传递</h2>

说明脚本作用域、执行限制,以及页面导航和弹窗的参数发送、读取、类型转换与排错。

<div class="doc-card-list">

<article class="doc-card">

<h3 id="script-scope-and-parameter-passing-item-1">脚本位置与作用域</h3>

<p>脚本位置决定作用域、执行时机及异步和写入权限。插件没有一个自动覆盖所有页面的全局脚本文档。</p>

<ul>

<li>Page Script:只属于当前页;顶层 var、let、const、class、function 可供同页动画和表达式引用。</li>

<li>hqVisuDesignerPageReady(ctx):页面运行时准备完成后执行一次,适合初始化组件;动画首轮就需要的常量和函数仍放 Page Script 顶层。</li>

<li>Setup Script:只为当前这一条行为准备变量和中间结果,不是页面全局区。</li>

<li>Condition / Value / Display Text / Fill / Border / Visibility / Source value:同步表达式位置,必须立即返回一个结果。</li>

<li>Click / Hover / Press-Release Script:事件触发的完整脚本体,可写多行逻辑;WriteTag 只允许真实 Click、Press 或 Release,Hover 不允许设备写入。</li>

</ul>

<ul class="doc-related-links">

<li><a href="/ppt/manual/design-reuse-guide/">动手练习:复用方式与参数</a></li>

<li><a href="/ppt/manual/recipe-popup-selection/">动手练习:弹窗选设备并返回</a></li>

</ul>

</article>

<article class="doc-card doc-card-tip">

<h3 id="script-scope-and-parameter-passing-item-2">动画脚本的推荐拆分方式</h3>

<p>同页共享的 Tag 前缀、量程和换算函数放 Page Script。具有 Setup Script 的颜色或文本行为可在其中准备局部结果。当前 Move、Rotate、Scale 编辑器没有 Setup Script 或 Post Operations 输入区:读取方法和换算表达式直接写入 Source value 或 Rotation input,需要复用的函数放 Page Script。</p>

<div class="manual-code" data-code-language="javascript"><div class="manual-code-toolbar"><span>JavaScript</span><span class="manual-code-tools"><small>JavaScript</small><button type="button" data-copy-code data-copied="已复制" data-failed="请选中代码后复制" aria-label="复制代码: JavaScript">复制代码</button><span class="manual-code-status" role="status"></span></span></div><pre tabindex="0" class="docs-code-block shiki github-light" style="background-color:#fff;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#6A737D">// 当前页 Page Script</span></span>

<span class="line"><span style="color:#D73A49">const</span><span style="color:#005CC5"> tankTagPrefix</span><span style="color:#D73A49"> =</span><span style="color:#032F62"> "PLC_LINE01.TANK01"</span><span style="color:#24292E">;</span></span>

<span class="line"><span style="color:#D73A49">function</span><span style="color:#6F42C1"> percent</span><span style="color:#24292E">(</span><span style="color:#E36209">value</span><span style="color:#24292E">, </span><span style="color:#E36209">min</span><span style="color:#24292E">, </span><span style="color:#E36209">max</span><span style="color:#24292E">) {</span></span>

<span class="line"><span style="color:#D73A49"> return</span><span style="color:#24292E"> Math.</span><span style="color:#6F42C1">max</span><span style="color:#24292E">(</span><span style="color:#005CC5">0</span><span style="color:#24292E">, Math.</span><span style="color:#6F42C1">min</span><span style="color:#24292E">(</span><span style="color:#005CC5">100</span><span style="color:#24292E">, (value </span><span style="color:#D73A49">-</span><span style="color:#24292E"> min) </span><span style="color:#D73A49">*</span><span style="color:#005CC5"> 100</span><span style="color:#D73A49"> /</span><span style="color:#24292E"> (max </span><span style="color:#D73A49">-</span><span style="color:#24292E"> min)));</span></span>

<span class="line"><span style="color:#24292E">}</span></span>

<span class="line"></span>

<span class="line"><span style="color:#6A737D">// Scale 的 Source value</span></span>

<span class="line"><span style="color:#6F42C1">percent</span><span style="color:#24292E">(</span><span style="color:#6F42C1">ReadTagDouble</span><span style="color:#24292E">(tankTagPrefix </span><span style="color:#D73A49">+</span><span style="color:#032F62"> ".LEVEL"</span><span style="color:#24292E">, </span><span style="color:#005CC5">0</span><span style="color:#24292E">), </span><span style="color:#005CC5">0</span><span style="color:#24292E">, </span><span style="color:#005CC5">10</span><span style="color:#24292E">)</span></span>

<span class="line"></span>

<span class="line"><span style="color:#6A737D">// Source minimum / maximum:0 / 100</span></span>

<span class="line"><span style="color:#6A737D">// Limit minimum / maximum:0 / 100</span></span>

<span class="line"><span style="color:#6A737D">// At limit minimum / maximum:0 / 1</span></span>

<span class="line"><span style="color:#6A737D">// Moving edge:Top</span></span></code></pre></div>

</article>

<article class="doc-card">

<h3 id="script-scope-and-parameter-passing-item-3">同步、异步与写入边界</h3>

<p>表达式位置不能直接放 fetch、Promise、setTimeout 或 setInterval,因为动画求值必须立即得到结果。异步准备放 Page Script 的 async 函数、hqVisuDesignerPageReady、Click Script 或 Hover Script,再把结果写入当前页变量或宿主数据源供动画读取。await 只能在 async 函数内部;顶层 await 和 import/export 模块语法不支持。设备写入必须来自真实用户点击、按下或释放,并继续接受宿主权限、确认、原因和审计控制。</p>

</article>

<article class="doc-card doc-card-warn">

<h3 id="script-scope-and-parameter-passing-item-4">页面导航传参:支持内容</h3>

<p>在 Open Link 中选择 Internal page 后,可通过 Parameters (optional) 传参。其他 Destination 按所选目标填写对应字段。脚本传参使用 hqVisuDesigner.openPage 的第二个参数。参数支持字符串、数字、布尔值和 null;目标页按字符串读取,null 读取为空字符串。</p>

<ul>

<li>parameters 必须是数组,每项形如 { key, value }。</li>

<li>数组保留顺序和重复 Key;普通对象不是 openPage 的正式参数格式。</li>

<li>frameTarget 支持 frame、fullscreen、_blank;openInNewWindow: true 等同 _blank。</li>

<li>同包页面使用 openPage;跨包使用 openScreen(screenCode),通用 Jump Parameters 不用于保证跨画面包传参。</li>

<li>外部 Website / File URL 参数会进入 URL 查询部分,目标系统按自己的查询参数规则读取。</li>

</ul>

<div class="manual-code" data-code-language="text"><div class="manual-code-toolbar"><span>Text</span><span class="manual-code-tools"><small>Text</small><button type="button" data-copy-code data-copied="已复制" data-failed="请选中代码后复制" aria-label="复制代码: Text">复制代码</button><span class="manual-code-status" role="status"></span></span></div><pre tabindex="0" class="docs-code-block shiki github-light" style="background-color:#fff;color:#24292e" tabindex="0"><code><span class="line"><span>hqVisuDesigner.openPage("device_details", {</span></span>

<span class="line"><span> frameTarget: "frame",</span></span>

<span class="line"><span> parameters: [</span></span>

<span class="line"><span> { key: "PLC", value: "PLC_LINE01" },</span></span>

<span class="line"><span> { key: "Device", value: "PUMP_01" },</span></span>

<span class="line"><span> { key: "Mode", value: 1 },</span></span>

<span class="line"><span> { key: "Enabled", value: true }</span></span>

<span class="line"><span> ]</span></span>

<span class="line"><span>});</span></span></code></pre></div>

</article>

<article class="doc-card">

<h3 id="script-scope-and-parameter-passing-item-5">目标页面读取与类型转换</h3>

<p>目标页应在 Page Script 中读取参数,并在使用前验证。GetPageParameter 返回第一个同名值;GetPageParameterValues 返回全部同名值数组;GetPageParameters 按原始顺序返回全部 { key, value }。三者也都有 hqVisuDesigner 命名空间版本。读取值都是字符串,因此数值和布尔值必须显式转换,拼接 Tag 前先限制允许字符。</p>

<div class="manual-code" data-code-language="javascript"><div class="manual-code-toolbar"><span>JavaScript</span><span class="manual-code-tools"><small>JavaScript</small><button type="button" data-copy-code data-copied="已复制" data-failed="请选中代码后复制" aria-label="复制代码: JavaScript">复制代码</button><span class="manual-code-status" role="status"></span></span></div><pre tabindex="0" class="docs-code-block shiki github-light" style="background-color:#fff;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">var</span><span style="color:#24292E"> plc </span><span style="color:#D73A49">=</span><span style="color:#6F42C1"> GetPageParameter</span><span style="color:#24292E">(</span><span style="color:#032F62">"PLC"</span><span style="color:#24292E">, </span><span style="color:#032F62">""</span><span style="color:#24292E">);</span></span>

<span class="line"><span style="color:#D73A49">var</span><span style="color:#24292E"> device </span><span style="color:#D73A49">=</span><span style="color:#6F42C1"> GetPageParameter</span><span style="color:#24292E">(</span><span style="color:#032F62">"Device"</span><span style="color:#24292E">, </span><span style="color:#032F62">""</span><span style="color:#24292E">);</span></span>

<span class="line"><span style="color:#D73A49">var</span><span style="color:#24292E"> modeText </span><span style="color:#D73A49">=</span><span style="color:#6F42C1"> GetPageParameter</span><span style="color:#24292E">(</span><span style="color:#032F62">"Mode"</span><span style="color:#24292E">, </span><span style="color:#032F62">"0"</span><span style="color:#24292E">);</span></span>

<span class="line"><span style="color:#D73A49">var</span><span style="color:#24292E"> enabledText </span><span style="color:#D73A49">=</span><span style="color:#6F42C1"> GetPageParameter</span><span style="color:#24292E">(</span><span style="color:#032F62">"Enabled"</span><span style="color:#24292E">, </span><span style="color:#032F62">"false"</span><span style="color:#24292E">);</span></span>

<span class="line"></span>

<span class="line"><span style="color:#D73A49">if</span><span style="color:#24292E"> (</span><span style="color:#D73A49">!</span><span style="color:#032F62">/</span><span style="color:#D73A49">^</span><span style="color:#005CC5">[A-Za-z0-9_-]</span><span style="color:#D73A49">{1,64}$</span><span style="color:#032F62">/</span><span style="color:#24292E">.</span><span style="color:#6F42C1">test</span><span style="color:#24292E">(plc) </span><span style="color:#D73A49">||</span></span>

<span class="line"><span style="color:#D73A49"> !</span><span style="color:#032F62">/</span><span style="color:#D73A49">^</span><span style="color:#005CC5">[A-Za-z0-9_-]</span><span style="color:#D73A49">{1,64}$</span><span style="color:#032F62">/</span><span style="color:#24292E">.</span><span style="color:#6F42C1">test</span><span style="color:#24292E">(device)) {</span></span>

<span class="line"><span style="color:#D73A49"> throw</span><span style="color:#D73A49"> new</span><span style="color:#6F42C1"> Error</span><span style="color:#24292E">(</span><span style="color:#032F62">"Invalid page parameter"</span><span style="color:#24292E">);</span></span>

<span class="line"><span style="color:#24292E">}</span></span>

<span class="line"></span>

<span class="line"><span style="color:#D73A49">var</span><span style="color:#24292E"> mode </span><span style="color:#D73A49">=</span><span style="color:#24292E"> Number.</span><span style="color:#6F42C1">parseInt</span><span style="color:#24292E">(modeText, </span><span style="color:#005CC5">10</span><span style="color:#24292E">);</span></span>

<span class="line"><span style="color:#D73A49">var</span><span style="color:#24292E"> enabled </span><span style="color:#D73A49">=</span><span style="color:#24292E"> enabledText </span><span style="color:#D73A49">===</span><span style="color:#032F62"> "true"</span><span style="color:#24292E">;</span></span>

<span class="line"><span style="color:#D73A49">var</span><span style="color:#24292E"> statusTag </span><span style="color:#D73A49">=</span><span style="color:#24292E"> plc </span><span style="color:#D73A49">+</span><span style="color:#032F62"> "."</span><span style="color:#D73A49"> +</span><span style="color:#24292E"> device </span><span style="color:#D73A49">+</span><span style="color:#032F62"> ".STATUS"</span><span style="color:#24292E">;</span></span></code></pre></div>

</article>

<article class="doc-card">

<h3 id="script-scope-and-parameter-passing-item-6">弹窗传参和关闭结果</h3>

<p>Open Page as Popup 的静态输入框只接受 JSON object,不接受顶层数组。启用 Build page parameters with an expression 后,运行时表达式可返回对象或有序的 { key, value } 数组;需要重复 Key 时使用数组。目标弹窗页仍使用 GetPageParameter* 读取。Close Current Popup 的 Result expression 是从弹窗返回打开方的结果通道,可返回布尔值、数字、字符串或对象;它与打开时的页面查询参数是两个方向、两套用途。</p>

</article>

<article class="doc-card">

<h3 id="script-scope-and-parameter-passing-item-7">参数数量、长度和安全限制</h3>

<p>Runtime 最多保留 64 项导航参数;Key 最长 256 个字符,Value 最长 2048 个字符,非法项会被忽略。参数进入 URL 查询部分,不得传密码、令牌、权限证明、个人敏感数据或大块 JSON。Cookie、localStorage、sessionStorage 受同源、iframe 和宿主加载方式影响,不能作为正式跨页面参数协议。页面参数也不能扩大宿主授予的 Tag、页面或用户权限。</p>

</article>

<article class="doc-card">

<h3 id="script-scope-and-parameter-passing-item-8">四类值的边界与排错顺序</h3>

<p>模板变量、Runtime Variable、PLC Tag 和页面参数解决的是不同问题:模板变量在实例/导出阶段替换;Runtime Variable 只做当前页联动;PLC Tag 属于宿主数据层;页面参数只在打开目标页面时传递上下文。参数读取为空时依次检查目标类型是否支持、Key 大小写、parameters 是否为数组、是否超过限制、宿主是否接管导航、目标地址是否带查询参数,以及是否错误使用了跨包相对路径。</p>

</article>

</div>

</div>