小型操作 CustomComponent 参数问题

我正在尝试使用 CustomComponent 可选地替换帖子的简短操作描述。

但是,帖子未正确传递给值转换器。

核心代码

  @cached
  get CustomComponent() {
    return applyValueTransformer("post-small-action-custom-component", null, {
      actionCode: this.code,
      post: this.post,
    });
  }

我的调试代码

  api.registerValueTransformer(
    "post-small-action-custom-component",
    (arg) => {
      console.log(arg);
    }
  );

输出:

context: Object { actionCode: "bid", post: undefined }
​​
测试 不检查参数,因此这种情况被忽略了。

我猜 post 参数应该是 this.args.post 而不是 this.post

我一直在尝试一种变通方法,即无条件地添加组件并让它自己检查该做什么,但不幸的是,参数似乎也没有正确传递,因此变通方法和正常实现在这里都会失败:

              <this.CustomComponent
                @code={{this.code}}
                @post={{this.post}}
                @createdAt={{this.createdAt}}
                @path={{this.path}}
                @username={{this.username}}
              />

PostSmallAction 中有 codecreatedAtpath 的 getter,但是(再次)this.post 不存在,并且 username() 似乎也有一个错误(this.args.post 中没有 action_code_who?),因此这些属性保持为空。

我找不到现有的“真实世界”实现。我真的是第一个使用这个的人吗?:thinking:

2 个赞

我提交了一个修复此问题的 PR FIX: correct argument passing for small action post value transformer and custom component by communiteq · Pull Request #34915 · discourse/discourse · GitHub

@david @saquetim 你们能看一下吗 :pleading_face:

2 个赞

感谢您注意到这个问题。

你说得对;post 参数应该是 this.args.post 而不是 this.post

这里的 username 有点误导。action_code_who 确实是正确的,但它被一些插件(如 assign 插件)使用,所以它并不总是在 post 对象中。要获取创建此小动作的用户,您可以使用 @post.username

我不确定是否可以将更改推送到您的 PR,所以我打开了下面的 PR 来解决这些问题:

  • 修复传递给 transformer 和自定义组件的 post 参数
  • username 参数重命名为 who,以尽量减少围绕此参数的混淆
  • 添加测试以验证参数是否正确传递

我认为你是。:smiley:

据我所知,旧 API 没有在我们跟踪的 all-the-* 存储库的任何自定义中被使用。我只添加了这一个,以防有自托管者在使用它。

:rocket: 太棒了!

嗯,感谢您的积极主动 :slight_smile:
我认为 discourse-encrypt 曾经使用过它,还有三个(!)我们正在维护的私人插件。

感谢您的解释,我之前不明白它是如何工作的,现在明白了。

最后一个请求:您的修复能否也向后移植到稳定版?

修复已反向移植到稳定版。

1 个赞

此主题在上次回复后 24 小时自动关闭。不再允许回复。