【问题标题】:What's the difference between _isEnabled and isEnabled in Anguilla?安圭拉的 _isEnabled 和 isEnabled 有什么区别?
【发布时间】:2012-08-09 19:17:39
【问题描述】:

我一直在关注 GUI 扩展,并注意到示例使用 _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。

【问题讨论】:

    标签: tridion tridion-2011


    【解决方案1】:

    命令调用以下方法:

    1. 可用
    2. 已启用
    3. 调用

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

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

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

    简而言之:使用下划线方法可能是不好的做法,但核心实现似乎确实让您更难“正确”地做到这一点。所以我的目标是避免使用下划线方法,但如果事实证明这样做太难了,也不要大汗淋漓。

    附: isValidSelection 是一种仅限 PowerTools 的方法,它将它们都需要的公共逻辑与每个命令的特定逻辑分开。

    【讨论】:

    • PowerTools 的 isValidSelection 很好。要管理管道,我们是否只需将其设置为真/假?我在 .js 源代码中看到了 pipeline.stop = true;。
    • pipeline.stop = true;确实意味着它不应该继续其他扩展或下划线方法。类似于“我最了解,不要再寻找其他答案了”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多