安圭拉的_isEnabled和isEnabled有什么区别?

时间:2012-08-13 14:28:08

标签: tridion tridion-2011

我一直关注GUI扩展,并注意到示例使用_isEnabledisEnabled,没有下划线。两者似乎都可以扩展或可能取代现有的功能。

的IsEnabled

例如,PowerTools基类(似乎不“扩展”现有功能)具有:

PowerTools.BaseCommand.prototype.isEnabled = function(selection, pipeline)
{
    var p = this.properties;

    if (!p.initialized)
    {
        this.initialize();
    }

    if (!this.isToolConfigured())
    {
        return false;
    }

    if (this.isValidSelection)
    {
        return this.isValidSelection(selection, pipeline);
    }

    return true;
};

工具可以使用此基类并声明.isValidSelection,例如:

PowerTools.Commands.CountItems.prototype.isValidSelection = 
                                       function (selection) { ... }

_isEnabled

我看到安圭拉使用._isEnabled来获取现有功能(在Chrome的控制台中代码中的许多地方)。例如,WhereUsed有:

Tridion.Cme.Commands.WhereUsed.prototype._isAvailable =
                      function WhereUsed$_isAvailable(selection) ...

私人功能?

我熟悉前面的下划线是私有变量的命名约定。 _isEnabled和其他以下划线“私有”开头的函数是什么?如果是,那么

  • 我们应该如何扩展(向现有代码添加其他功能)这些功能?
  • 我们应该如何替换(没有现有的代码运行,而是让我们的运行代替“覆盖”)这些?

我假设相同的方法适用于以下划线开头的其他函数,例如_isAvailable_invoke

1 个答案:

答案 0 :(得分:8)

为命令调用以下方法:

  1. isAvailable
  2. 的IsEnabled
  3. 调用
  4. 所有命令的基类 - Tridion.Core.Command - 都具有这些方法的标准实现。在大多数情况下,此默认实现允许扩展命令。他们还调用下划线方法(_isAvailable,_isEnabled和_execute)。

    我不知道为什么CME命令只覆盖下划线方法。也许有人认为这样更容易。它们应该被认为是私有的(或者相当于C#中的“受保护”),所以它实际上对我来说似乎是一种不好的做法。

    实现正确的方法(isAvailable,isEnabled和invoke)然后使用this.callBase调用基本实现会更清晰。但是,在这种情况下,您可能需要停止管道,或者还要覆盖下划线方法,以避免您的返回值被默认的下划线方法覆盖。这取决于您正在实施或扩展的命令。

    简而言之:使用下划线方法可能是不好的做法,但Core实现似乎使您更难以“正确”地执行此操作。因此,我的目标是避免使用下划线方法,但如果事实证明这样做太难了就不会出汗。

    P.S。 isValidSelection是一个仅限PowerTools的方法,它将所有需要的公共逻辑与特定于每个命令的逻辑分开。