首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安圭拉的_isEnabled和isEnabled有什么区别?

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

Stack Overflow用户
提问于 2012-08-13 14:28:07
回答 1查看 202关注 0票数 7

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

isEnabled

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

代码语言:javascript
复制
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,例如:

代码语言:javascript
复制
PowerTools.Commands.CountItems.prototype.isValidSelection = 
                                       function (selection) { ... }

_isEnabled

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

代码语言:javascript
复制
Tridion.Cme.Commands.WhereUsed.prototype._isAvailable =
                      function WhereUsed$_isAvailable(selection) ...

私人活动?

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

  • 我们应该如何扩展这些函数(向现有代码添加附加功能)?
  • 我们应该如何替换(没有运行现有代码,而是像在“覆盖”中那样运行我们的代码)?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-13 16:29:25

命令调用以下方法:

  1. isAvailable
  2. isEnabled
  3. 调用

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

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

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

简而言之:使用下划线方法可能是不好的做法,但核心实现似乎使您更难“正确”地执行它。因此,我的目标是避免下划线方法,但如果结果是太难做到的话,不要操之过急。

P.S. isValidSelection是一种只使用PowerTools的方法,它将它们都需要的公共逻辑从每个命令的特定逻辑中分离出来。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11936363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档