我一直在关注GUI扩展,并且注意到示例使用_isEnabled
或isEnabled
,而没有下划线。两者似乎都可以扩展或替换现有功能。
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/