首页 > 解决方案 > Apostrophe-CMS PageBeforeSend 特定于模块

问题描述

我有一个扩展撇号自定义页面的模块。我正在尝试将一些额外的数据添加到页面请求中(以异步方式,防止使用帮助程序)。

我希望挂钩到 pageBeforeSend 事件,但后来意识到它会为每个页面请求运行,即使是那些实际上没有命中模块中页面的请求。

是否有与 pageBeforeSend 等效的方法,仅当被请求的页面实际上位于定义该方法的模块中时才会调用该方法?

我目前正在使用 dispatch 来处理这个问题,但我希望可能有更好的方法。

标签: apostrophe-cms

解决方案


您的问题的简短回答是否定的。在 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片段的所有事件,但不匹配页面)。


推荐阅读