9

我有一个 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);

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

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

未捕获的类型错误:对象 # 没有方法 'getId'

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

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

if ($display.getView().getId && $display.getView().getId() == "PublishPopup") {

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

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

4

2 回答 2

6

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

<cfg:extension target="Tridion.Web.UI.Editors.CME.Views.Popups.Publish">

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

然后我的 js 文件如下所示:

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

function onDisplayStarted() {

        $log.message("stuff here");
}
于 2012-10-15T18:15:29.653 回答
5

好吧,有两个不同的视图,它们同时加载 - Dashboard View 和 Tridion Dashboard View。Tridion 仪表板视图是您在功能区工具栏中单击 SDL Tridion 选项卡时看到的内容。事实上,这个视图没有 getId 方法(这很奇怪,顺便说一句)。这就是为什么你有这个问题。

尽管如此,configuraton 文件中文件组背后的整个想法是尽量减少为每个视图加载的 javascript 数量,并尽量减少不需要的 javascript 处理。因此,我建议将您的 javascript 文件拆分为多个部分,并仅在必要时加载它们。

于 2012-10-16T07:35:02.617 回答