apostrophe-cms - Apostrophe-CMS PageBeforeSend 特定于模块
问题描述
我有一个扩展撇号自定义页面的模块。我正在尝试将一些额外的数据添加到页面请求中(以异步方式,防止使用帮助程序)。
我希望挂钩到 pageBeforeSend 事件,但后来意识到它会为每个页面请求运行,即使是那些实际上没有命中模块中页面的请求。
是否有与 pageBeforeSend 等效的方法,仅当被请求的页面实际上位于定义该方法的模块中时才会调用该方法?
我目前正在使用 dispatch 来处理这个问题,但我希望可能有更好的方法。
解决方案
您的问题的简短回答是否定的。在 Apostrophe 2.x(当前稳定版本)中,您必须自己决定您的pageBeforeSend
函数是否对特定文档感兴趣,如果不相关,则立即返回或调用回调(如果有的话)。
但是,这里有一个更长的答案,可能会为您提供更多关于这个问题的信息。
该方法很特殊:它为它所在的每个模块pageBeforeSend
调用。这被称为一种方法。callAll
因此,在 callAll 方法中,您负责决定请求或文档是否与您的兴趣相关。如果您查看我们自己的 callAll 方法处理程序,您会注意到,如果有任何疑问,我们总是首先立即调用回调并在请求或文档不相关时返回。
请注意,在新代码中您不应该编写新的callAll
处理程序。您应该改为编写promise 事件处理程序。这是在 2.x 和 3.x 中推荐的,这将是唯一的方法。然而,在 2.x 中,您的问题在编写 promise 事件处理程序时具有相同的答案:您必须确定请求或文档是否与您的兴趣相关,如果不相关,则礼貌地返回而不做任何事情。
在 3.x 中,我们将对此进行改进。3.x 代码(非常正在进行中,尚未为项目做好准备!)beforeInsert
通过相关文档的文档管理器模块发出事件,但让您决定是通过该模块的名称还是通过父模块来捕获它们类apostrophe-doc-type-manager
(匹配所有beforeInsert
文档类型的所有事件)或apostrophe-pieces
(匹配beforeInsert
片段的所有事件,但不匹配页面)。
推荐阅读
- bash - 如何使用 shell 脚本在目录中创建目录?
- django - 在两个模型 Django 中使用 manytomany 字段
- spring-boot - 如何使用 Mockk 在 Kotlin 中模拟 LocalDateTime()
- swift - Self 实现 IteratorProtocol 时 Swift 如何推断 Sequence 需求?
- python - 如何在不修改源的情况下在函数中附加/前置列表?
- spring-boot - 使用 spring-boot-starter-data-redis 时控制台出现错误
- java - java对象上的同步块不起作用
- ios - 为什么 Swift ARC 不首先打破属性引用以防止保留循环?
- c++ - 如何在 c++20 约束算法中投影 std::tuple
- reactjs - useState 中的自定义钩子