Skip to content

挖坑记

im3x-dev edited this page Oct 12, 2020 · 3 revisions

记录学习开发过程中遇到的一些坑和有趣的经验成果

脚本如何获取父层加载器名称?

我们的组件脚本,基本都是靠加载器来加载运行,目前的加载器有Loader.GiteeLoader.Github两种,未来还可能支持更多自定义。
那么我们的组件脚本,如何获取父层是哪个加载器呢?

解答这个问题之前,我们先问问,为什么。

为什么要获取父层加载器?

scriptable app有一个非常使用的功能:URLScheme:scriptable:///run?scriptName=加载器名称
所以好玩的就来了,我们可以设置组件的点击跳转 URL 为 scriptable:///run?...,有什么用呢?
用户点击后,可以跳转回应用,如果指明了加载器的脚本名称,还可以跳转后直接执行对应脚本

所以,这个脚本名称,也就是我们要执行的脚本 —— 加载器,就非常重要了

还有个为什么,就是:为什么要跳回来执行加载器?

在测试中发现,点击组件后跳转 scriptable 应用,继续点击加载器代码,可会继续执行当前的组件脚本。
也就是:脚本组件出了负责展示数据之外,我们还可以给它扩展一种能力:在非桌面环境上运行(也就是跳回应用内通过加载器执行)

用处就是:可以对用户进行交互,比如弹窗、复制、打开页面、输入、选择等操作


有点绕,总结一下:

  1. 桌面组件脚本,写两个功能:1) 展示界面(桌面环境执行);2)和用户交互(非桌面环境执行)
  2. 要执行上边的步骤2,我们需要用 URL Scheme 跳回 Scriptable,然后继续执行加载器脚本
  3. 要执行加载器脚本,我们首先得 ———— 获取加载器名称!!

非常简单啦: Script.name() 即可 😂

案例说明

我们创建一个组件,显示一个图片,用户点击后,进行下载操作!

代码这么写,在组件的 render 函数,判断运行环境,然后接收参数,做相应操作:

  async render () {
    // 如果是编辑器内执行,则弹出菜单
    if (!config.runsInWidget) {
      let alert = new Alert()
      alert.title = "成功"
      alert.message = JSON.stringify(args['queryParameters'])
      alert.presentAlert()
    } else {
      if (this.widgetSize === 'medium') {
        return await this.renderMedium()
      } else if (this.widgetSize === 'large') {
        return await this.renderLarge()
      } else {
        return await this.renderSmall()
      }
    }
  }

然后设置组件的点击URL:

w.url = 'scriptable:///run?scriptName=' + encodeURIComponent(Script.name()) + '&act=download&img=https://i.loli.net/2020/10/10/6tLnwuzBrk3qxGd.jpg'

注意:要用 encodeURIComponent来 url编码插件名称,不然会导致无法打开链接

这样操作之后,不管是组件单独运行,还是通过加载器运行,用户点击,就会跳转到对应的 urlschema(可以确保脚本存在),执行脚本,然后执行对应的非渲染操作了