-
Notifications
You must be signed in to change notification settings - Fork 244
挖坑记
im3x-dev edited this page Oct 12, 2020
·
3 revisions
记录学习开发过程中遇到的一些坑和有趣的经验成果
我们的组件脚本,基本都是靠加载器来加载运行,目前的加载器有Loader.Gitee
、Loader.Github
两种,未来还可能支持更多自定义。
那么我们的组件脚本,如何获取父层是哪个加载器呢?
解答这个问题之前,我们先问问,为什么。
scriptable
app有一个非常使用的功能:URLScheme:scriptable:///run?scriptName=加载器名称
所以好玩的就来了,我们可以设置组件的点击跳转 URL 为 scriptable:///run?...
,有什么用呢?
用户点击后,可以跳转回应用,如果指明了加载器的脚本名称,还可以跳转后直接执行对应脚本
所以,这个脚本名称,也就是我们要执行的脚本 —— 加载器,就非常重要了
在测试中发现,点击组件后跳转 scriptable 应用,继续点击加载器代码,可会继续执行当前的组件脚本。
也就是:脚本组件出了负责展示数据之外,我们还可以给它扩展一种能力:在非桌面环境上运行(也就是跳回应用内通过加载器执行)
用处就是:可以对用户进行交互,比如弹窗、复制、打开页面、输入、选择等操作
有点绕,总结一下:
- 桌面组件脚本,写两个功能:1) 展示界面(桌面环境执行);2)和用户交互(非桌面环境执行)
- 要执行上边的步骤2,我们需要用 URL Scheme 跳回 Scriptable,然后继续执行加载器脚本
- 要执行加载器脚本,我们首先得 ———— 获取加载器名称!!
非常简单啦: 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(可以确保脚本存在),执行脚本,然后执行对应的非渲染操作了