【问题标题】:Apostrophe-CMS PageBeforeSend Specific to ModuleApostrophe-CMS PageBeforeSend 特定于模块
【发布时间】:2019-05-27 06:48:36
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: apostrophe-cms


    【解决方案1】:

    您的问题的简短回答是否定的。在 Apostrophe 2.x(当前稳定版本)中,您必须自己决定您的 pageBeforeSend 函数是否对特定文档感兴趣,如果不相关,则立即返回或调用回调(如果有的话)。

    但是,这里有一个更长的答案,可能会为您提供更多关于这个问题的信息。

    pageBeforeSend 方法很特殊:它所在的每个模块都会调用它。这称为callAll 方法。

    因此,在 callAll 方法中,您负责决定请求或文档是否与您的兴趣相关。如果您查看我们自己的 callAll 方法处理程序,您会注意到,如果有任何疑问,我们总是首先立即调用回调并在请求或文档不相关时返回。

    请注意,在新代码中您应该编写新的callAll 处理程序。你应该改写promise event handlers。这是在 2.x 和 3.x 中推荐的,这将是唯一的方法。但是在 2.x 中,您的问题在编写 promise 事件处理程序时具有相同的答案:您必须确定请求或文档是否与您的兴趣相关,如果不相关,则礼貌地返回而不做任何事情。

    在 3.x 中,我们将对此进行改进。 3.x 代码(非常正在进行中,尚未准备好进行项目!)通过文档管理器模块为相关文档发出类似beforeInsert 的事件,但让您决定是否通过该模块的名称捕获它们,或者通过父类,如apostrophe-doc-type-manager(匹配所有文档类型的所有beforeInsert事件)或apostrophe-pieces(匹配所有beforeInsert片段的事件,但不匹配页面)。

    【讨论】:

    • 这确实很好地解释了它,谢谢!现在我对 3.x 更加兴奋了——听起来这将是对已经很棒的 CMS 的一次极好的改进。出于好奇,3.x 代码库是否可以在某个地方查看?不适合在项目中使用,因为它还为时过早,只是为了看看其中的一些差异——我过去看过很多 2.x 代码。
    • 当然,只需查看撇号 github repo 的 3.0 分支。 async-await 分支也很有趣,因为主要的后端重构已经结束,很快就会合并回 3.0。
    【解决方案2】:

    如果您想将该行为应用到您的特定模块而不是其他页面,您应该在该模块中添加 pageBeforeSend 方法。

    您可以在文档中看到一个类似的示例,其中包含一个扩展撇号片段的模块,它们修改了 beforeSave,但仅针对该模块而不会干扰其他模块。

    https://docs.apostrophecms.org/apostrophe/tutorials/getting-started/reusable-content-with-pieces#customizing-the-model-layer-setting-the-title-automatically

    【讨论】:

    • beforeSave 只会在保存该模块创建的片段时运行。您发布的示例中的代码或多或少是我的模块中的代码(当然,使用 pageBeforeSend 而不是 beforeSave)。但是,pageBeforeSend 似乎在访问任何模块的任何页面时运行。我有数据,我只想在加载特定页面时出现在 req.data 中,并且除了在方法中添加检查以查看正在加载的页面类型之外,看不到使用 pageBeforeSend 执行此操作的方法,我宁愿不这样做。
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多