Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add plugin function transaction #9172

Closed
frostime opened this issue Sep 12, 2023 · 10 comments
Closed

Add plugin function transaction #9172

frostime opened this issue Sep 12, 2023 · 10 comments
Assignees
Milestone

Comments

@frostime
Copy link
Contributor

frostime commented Sep 12, 2023

In what scenarios do you need this feature?

protyle 下的编辑器绑定了 input 事件,在前端触发 input 的时候可以提醒后端更新数据。

在插件代码中也可以模拟这一操作,这样就可以在只更改前端的文本而不需要向后端发请求的情况下就更改思源的数据。

image

我感觉这个操作对插件开发挺便利的,建议把自定义触发 input 事件作为一个 protyle 的接口开发给插件系统。

image

Describe the optimal solution

添加 API

@Vanessa219

Describe the candidate solution

No response

Other information

No response

@Vanessa219
Copy link
Member

input 中有大量的业务逻辑在里面,很多是涉及用户输入的,如果触发的话可能会造成原有输入业务错误。需要保存数据的话可以单独提供接口。

@frostime
Copy link
Contributor Author

input 中有大量的业务逻辑在里面,很多是涉及用户输入的,如果触发的话可能会造成原有输入业务错误。需要保存数据的话可以单独提供接口。

简单来讲就是需要一个在前端更改 html 内容、相应的更改可以直接同步到后端的方案。目前后端只给了一次性 update 一个 block 的方法。但是如果我只是想要更改一小部分,那就不得不为了一小部分的更改绕一大圈。

比如我给的例子,他的功能是「点击链接后,fetch 对应的 url 并根据将链接锚文本设置对应 url 网页的 title」
如果从前端更改,我只需要重写 span.innerText 就行了 —— 但是如果不触发 input 方法,这个更改并不会同步到后端数据中。
但是如果从后端更改,我就要 1) 获取 block 2) 解析 block 内容 3) 更改 block 内容 4) 调用后端 API update block,麻烦很多。

@frostime
Copy link
Contributor Author

图中给的 updateProtyle 这个通过 dispatch 自定义 Event 的方案,是我发现前端在更改了 html 标签内容后,只要在那个块上随便编辑两下就能保留之前的更改,于是根据这个特点设计的。

那么遵照这个思路——也许可以单独设置一个接口,把当前对前端的更改同步到后端?

@Vanessa219
Copy link
Member

这里有一个撤销的问题,所以需要按照你上面的 1-4 进行操作。如果提供接口的话,还是需要经过 1 后才能调用接口。

@zxhd863943427
Copy link
Contributor

zxhd863943427 commented Sep 13, 2023

那能否增加一个接口,传入protyle和id之后,就能转发对应的内容更改到后端?

也可以在protyle里增加一个方法,这样传入id就行。

当然,能传dom也可以。

@frostime
Copy link
Contributor Author

那能否增加一个接口,传入protyle和id之后,就能转发对应的内容更改到后端?

也可以在protyle里增加一个方法,这样传入id就行。

当然,能传dom也可以。

就是换一个思路,不在和用户争抢 input 事件了,单独做一个接口出来以达成在前端更改 html 内容、相应的更改可以直接同步到后端的目的。

@Vanessa219
Copy link
Member

但是这个接口最终下来还是和调用 API update block 的过程一样,避免不了步骤。除非不需要做 undo

@frostime
Copy link
Contributor Author

frostime commented Sep 14, 2023

但是这个接口最终下来还是和调用 API update block 的过程一样,避免不了步骤。除非不需要做 undo

插件行为本来也没有什么 undo 的需求吧。这个本来就是给插件的一个功能糖,也许 update block 可以做到一样的功能,但是这个显然更加方便快捷。

@Vanessa219
Copy link
Member

Vanessa219 commented Sep 16, 2023

这样的话接口什么样比较合适呢? 下面这个可以不?

 transaction(protyle, doOperation: IOperation[])

IOperation

@frostime
Copy link
Contributor Author

这样的话接口什么样比较合适呢? 下面这个可以不?

 transaction(protyle, doOperation: IOperation[])

IOperation

能把 transaction 这么大一个接口放出来当然很高兴啦,不过这个接口功能也太全了,不知道要怎么用。。。
如果只是想要把当前的 dom 元素内容同步到后端,是用这个方法吗?

image

const doInsert: IOperation = {

@Vanessa219 Vanessa219 changed the title 为 Protyle 增加一个触发 input 事件的方法 Add plugin function transaction Sep 16, 2023
@Vanessa219 Vanessa219 self-assigned this Sep 16, 2023
@Vanessa219 Vanessa219 added this to the 2.10.6 milestone Sep 16, 2023
Vanessa219 added a commit to siyuan-note/petal that referenced this issue Sep 17, 2023
Vanessa219 added a commit to siyuan-note/petal that referenced this issue Sep 17, 2023
Vanessa219 added a commit to siyuan-note/plugin-sample that referenced this issue Sep 17, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants