1

从几天前开始,我一直在努力寻找在默认情况下在每个 dashlet 的标题栏中添加自定义操作的最佳方法。

在这个阶段,我知道这些操作在每个 dashlet 的 webscript 中都设置为一个小部件。例如,在docsummary.get.js中:

   var dashletTitleBarActions = {
      id : "DashletTitleBarActions",
      name : "Alfresco.widget.DashletTitleBarActions",
      useMessages : false,
      options : {
         actions: [
             {
                cssClass: "help",
                bubbleOnClick:
                {
                   message: msg.get("dashlet.help")
                },
                tooltip: msg.get("dashlet.help.tooltip")
             }
         ]
      }
   };
   model.widgets = [docSummary, dashletResizer, dashletTitleBarActions];

然后,在呈现页面时实例化小部件。

我已经想出了下一个方法:

  1. 每次呈现页面时,在自定义 JS 片段中使用我需要的操作来增加每个小部件实例的“操作”数组。我使用以下技术进行了一些测试但没有成功:http: //acidmartin.wordpress.com/2012/03/19/getting-instance-names-of-a-javascript-object/

  2. 通过添加我的自定义操作来修改 Alfresco.widget.DashletTitleBarActions 的原型。我相信它也不起作用,因为当小部件被实例化时,“动作”对象总是被覆盖,正如您在上面粘贴的代码中看到的那样。

  3. 为每个 dashlet 的 webscript 创建一个扩展模块,为每个 Alfresco.widget.DashletTitleBarActions 小部件定义添加自定义操作,就像 Dave Drapper 在他的帖子http://blogs.alfresco.com/wp/ddraper/2012/05/22中解释的那样/customizing-share-javascript-widget-instantiation-part-1/

  4. 获取每个 dashlet div 容器,并在页面准备好后添加直接操作 DOM 所需的操作。它应该可以工作,但我认为它有点脏且不一致,因此我想避免它。

谁能想象一个更好和可行的解决方案?

4

2 回答 2

4

让我们从向一个现有的 dashlet 添加一个动作开始。正如您在 (3) 中建议的那样,您可以定义一个可扩展性模块来通过拦截和修改其模型来更改 dashlet 的行为。

博客文章和后续文章中很好地介绍了创建可扩展性模块,但这里的技巧是提供一个控制器 JavaScript 扩展来定位DashletTitleBarActions小部件并向其添加您的操作,例如

if (model.widgets)
{
    for (var i = 0; i < model.widgets.length; i++)
    {
        var widget = model.widgets[i];
        if (widget.id == "DashletTitleBarActions")
        {
            widget.actions.push({...})
        }
    }
}

您在对象文字中添加的内容取决于您的操作是如何实现的。如果您需要一些客户端行为(而不是静态链接),那么您还需要使用 a 绑定它CustomEvent- 请参阅 RSS Feed dashletorg/alfresco/components/dashlets/rssfeed.get.html.ftl以获取示例。

可扩展性模块的缺点是您需要为每个 dashlet 定义一个显式的扩展 JS 文件。您可以轻松地将上面的代码放在一个中央文件中,然后将其包含在需要它的每个 dashlet 扩展中,例如

<import resource="classpath:alfresco/site-webscripts/org/myco/utils/dashlet.utils.js">
于 2013-01-29T18:15:13.013 回答
1

我会在这里走2号路。

此小部件的定义在 share.js 文件 ({share.context}/js/share.js) 中。对于 Alfresco 4.2,DashletTitleBarActions 定义在第 1700 行左右。在小部件的onReady处理程序中,有一个处理动作的循环。

 // Reverse the order of the arrays so that the first entry is furthest to the left...
        this.options.actions.reverse();
        // Iterate through the array of actions creating a node for each one...
        for (var i = 0; i < this.options.actions.length; i++)
        {

如您所见,它反转了动作参数的顺序,然后添加了开始循环动作。因此,根据您希望您的操作是第一个还是最后一个,您可能可以编辑此文件并添加您的自定义操作:

myAction = {
"cssClass": "customCSS"
, "tooltip": this.msg("slingshot.messages.generic.tooltip")
, "eventOnClick": ...
...
}
this.options.actions.push(myAction);
// now move on with the rest of the loop
for (...)

当然,这需要覆盖共享自己的 js 文件,而不是扩展它。如果你不能这样做,那么你必须在每个包含 share.js 的页面上包含一个自定义 JS 文件,并确保它在share.js之后但在任何小部件准备好之前执行,并覆盖onReady小部件本身的方法,以便它执行此操作。

于 2013-01-29T21:25:39.667 回答