2

我需要在运行时动态更改 ICN 查看器中显示的每个文档的“标题”。我将从文档属性中读取新的查看器选项卡标题

环境:ICN 2.0.3 CM8.5 为 8.5.5

到目前为止的代码:

  1. 我通过挂钩“ecm.model.desktop,onChange”找到了一个部分解决方案:

    aspect.after(ecm.model.desktop, 'onChange', function() {
       var contentViewer = dijit.byId('contentViewer');
       if (contentViewer) {
          var viewerTabTitleDef = new ViewerTabTitleDef ();
          contentViewer.mainTabContainer.getChildren().forEach(function(child) {
             viewerTabTitleDef.changeTitle(viewerTabTitleDef.self,
                child.controlButton, child.contentViewerPane.viewerItem.item);
          });
          ...
    
  2. 我能够为在同一查看器中打开的后续文档扩展此功能,并在此初始调用后通过“删除()”处理程序进行优化。这是完整的代码:

    var kill = aspect.after(ecm.model.desktop, 'onChange', function() {
    
       var contentViewer = dijit.byId('contentViewer');
       // "contentViewer" will be "unknown" unless viewer invoked
       console.log('onChange: contentViewer', contentViewer);  
    
       if (contentViewer) {
          console.log("new ViewerTabTitleDef()...");
          kill.remove();
          var viewerTabTitleDef = new ViewerTabTitleDef ();
          contentViewer.mainTabContainer.getChildren().forEach(function(child) {
              // For initially opened tabs
              console.log('initially opened: child', child);
              viewerTabTitleDef.changeTitle(viewerTabTitleDef.self, child.controlButton, child.contentViewerPane.viewerItem.item);
          });
          aspect.after(contentViewer.mainTabContainer, 'addChild', function(child) {
              // For tabs added after the viewer was opened
              console.log('subsequently opened: child', child);
              viewerTabTitleDef.changeTitle(viewerTabTitleDef, child.controlButton, child.contentViewerPane.viewerItem.item);
          }, true);
       } // end if contentViewer
    
    });  // end aspect.after(onChange desktop)
    
  3. 当前问题:

    问:如何更改拆分选项卡的标签(垂直或水平)?

    到目前为止,我还没有找到可以触发的任何 ICN/ECM 小部件或对象变量的任何事件。

先感谢您!

================================================

附录:

非常感谢 Ivo Jonker,他建议修改小部件原型的“getHtmlName()”方法。有效!

具体来说:

  1. 我正在从 ICN 插件调用此代码。我在插件的基本 .js 文件中设置了事件处理程序,但它实际上是在新的、单独的查看器窗口中调用的。

  2. 最初的原型是这样的:

    getHtmlName: function() {
        var methodName = "getHtmlName";
        this.logEntry(methodName);
    
        var displayName = this.item.getDisplayValue("{NAME}");
        if (displayName == "") {
            displayName = this.item.name;
        }
    
        var htmlName = entities.encode(displayName);
        this.logExit(methodName);
        return htmlName;
    },
    
  3. 根据 Ivo 的建议,我像这样覆盖了原型方法:

        myPluginDojo.viewerTabTitleDef = viewerTabTitleDef;
        ...
        ecm.widget.viewer.model.ViewerItem.prototype.getHtmlName = function () {
            console.log("NEW getHtmlName()...");
            var displayName = myPluginDojo.viewerTabTitleDef.getTitle(this.item);
            return displayName;
        };
    
4

1 回答 1

1

如果我理解正确,您想在打开文档时在导航器查看器中显示不同的选项卡标题(而不是文档标题)?

这个怎么样:

您在查看器中打开的每个文档都包含在 ecm.widget.viewer.model.ViewerItem 中,它公开了返回选项卡中使用的名称的 getHtmlName。

您的解决方案是实现您自己的 getHtmlName。

不幸的是,ViewerItem 是在 ecm.widget.viewer.ContentViewer#_open 中构造的,然后传递给 ecm.widget.viewer.ContentViewer#_openTab。因此,您要么通过与 IBM 私有方法混合而违反最佳实践,要么采用通用方法并仅替换 ecm.widget.viewer.model.ViewerItem.prototype.getHtmlName

于 2018-05-18T08:46:40.737 回答