如何在Tridion的CME中处理视图的加载

Fra*_*len 8 tridion

我有一个Tridion 2011 Content Manager Explorer的扩展,我只想为特定的视图执行特定的JavaScript.

我使用以下JavaScript片段执行此操作:

var onDisplayStarted = function () {
    $evt.removeEventHandler($display, "start", onDisplayStarted);

    if ($display.getView().getId() == "PublishPopup") {
      ...
    }
};
$evt.addEventHandler($display, "start", onDisplayStarted);
Run Code Online (Sandbox Code Playgroud)

此代码在过去运行良好,它肯定会在PublishPopup打开时触发并确保我的代码仅在该特定视图中执行.

但不幸的是,我有时会在加载以下内容时在JavaScript控制台中收到以下错误消息DashboardView:

未捕获的TypeError:对象#没有方法'getId'

该错误不会导致任何问题,很可能是因为Tridion的UI框架正确处理了事件处理程序中的错误.但我仍然不希望在JavaScript控制台中显示错误.

我理解如何检测getId方法是否存在:

if ($display.getView().getId && $display.getView().getId() == "PublishPopup") {
Run Code Online (Sandbox Code Playgroud)

但这只意味着代码永远不会执行.虽然它现在似乎工作得很好,但PublishPopup我宁愿知道处理这种类型的"我的代码应该在视图初始化后执行"的正确方法.

有谁知道更好的方法来处理这个?

joh*_*ter 6

您的配置中是否包含仅在弹出窗口中包含扩展名的代码?例如:

<cfg:extension target="Tridion.Web.UI.Editors.CME.Views.Popups.Publish">
Run Code Online (Sandbox Code Playgroud)

我通常使用该配置仅在cme中的特定视图上运行脚本.

我的js文件看起来像这样:

$evt.addEventHandler($display, "start", onDisplayStarted);

function onDisplayStarted() {

        $log.message("stuff here");
}
Run Code Online (Sandbox Code Playgroud)

  • 嘿约翰,谢谢你的回答.你的方法确实是我通常会这样做的.但在这种情况下,我有一个JavaScript文件,其中只有一些部分需要定位到`PublishPopup`.我可以将JavaScript分成两个文件并使用配置来定位每个文件,但我希望在代码中也可以有一种方法.`$ display"start"`事件工作得很好,我只是不明白为什么getId方法还不可用(以及是否保证只发生在`DashboardView`). (2认同)

Bor*_*nko 5

好吧,有两个不同的视图,它们同时加载 - Dashboard View和Tridion Dashboard View.Tridion Dashboard View是您在Ribbon工具栏中单击SDL Tridion选项卡时看到的.实际上,这个视图没有getId方法(这很奇怪,顺便说一句).这就是你遇到这个问题的原因.

然而,configuraton文件中文件组背后的整个想法是最小化为每个视图加载的javascript的数量,并最小化不需要的javascript处理.因此,我建议将您的javascript文件拆分成碎片并仅在必要时加载它们.