我一直在关注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

我看到Anguilla使用._isEnabled来实现现有功能(在Chrome控制台的代码中很多地方)。例如,WhereUsed具有:

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


私人职能?

我熟悉前面的下划线是私有变量的命名约定。 _isEnabled和其他以下划线开头的功能是否为“私有”?如果是这样的话


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


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

最佳答案

命令使用以下方法:


isAvailable
isEnabled
调用


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

我不知道为什么CME命令只覆盖下划线方法。也许有人认为那样比较容易。应该将它们视为私有的(或C#中的“受保护”的等效项),因此对我来说实际上似乎是一个坏习惯。

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

简而言之:使用下划线方法可能是不好的做法,但是Core实现的确使您很难“正确”地进行操作。因此,我的目标是避免使用下划线方法,但是如果发现这样做太困难,则不要流汗。

附言isValidSelection是仅PowerTools的方法,用于将它们都需要的通用逻辑与特定于每个命令的逻辑分开。

关于tridion - Angular中的_isEnabled和isEnabled有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11936363/

10-12 19:10