支持窗口小部件定制和个性化(不推荐)

当您开发窗口小部件时,请考虑用户希望如何定制和个性化窗口小部件。然后,您可以在各种窗口小部件属性层中提供适当的代码。

关于此任务

定义窗口小部件时,其属性便是定制点。即,您可以使用这些属性为所有用户定制特定使用的窗口小部件,也可以为单个用户个性化窗口小部件。存在四个显示这些窗口小部件属性的层:
  • 定义层为窗口小部件的所有实例设置缺省属性值。
  • 管理层在运行时为窗口小部件的所有实例设置属性值。超级用户在窗口小部件处于 config 方式时设置这些属性。
  • 实例层为窗口小部件的特定实例设置属性值。页面编辑者在窗口小部件处于 edit 方式时设置这些属性。
  • 用户层为特定用户的窗口小部件特定实例设置属性值。页面编辑者在窗口小部件处于 personalize 方式时显式设置这些属性,或在窗口小部件处于 view 方式时隐式设置这些属性。
有关这些层以及它们如何交互设置属性值的信息,请参阅不推荐:窗口小部件属性层

当您对每个方式进行编码时,请考虑这些层。只显示对特定用户有意义的属性。例如,如果有一种只有超级用户应该可以更改的属性,请放入代码以支持在 config 方式下进行该更改。如果具有超级用户和编辑者可以进行的更改,请放入代码以支持在 config 方式和 edit 方式下进行该更改。

当允许用户个性化窗口小部件时,请决定是希望显式设置属性、隐式设置属性还是两者同时设置。
  • 当用户有意决定希望查看的内容时,会发生显式个性化。例如,当用户从窗口小部件菜单中单击个性化时,其会有目的地选择设置并保存它。
  • 当用户无意选择希望查看的内容时,会发生隐式个性化。例如,如果窗口小部件具有表和设置对表进行排序的列的属性,那么您可以对窗口小部件进行编码,以在用户选择列标题时更改属性。选择列标题的操作表明用户首选以此方式排序数据,并会自动保存设置。

将窗口小部件的个性化限制为对个别用户有意义的更改。例如,对于天气窗口小部件,个别用户可能需要个性化预测的位置。但是,个别用户可能不需要个性化预测的天数,因此您可以不支持在 personalize 方式或 view 方式下更改属性。如果您确实希望提供部分定制,更加适当的做法是允许管理员为所有用户定制预测天数,您可以将适当的代码包含在 config 方式中。

过程

  1. 将窗口小部件的所有定制和个性化点定义为窗口小部件定义 XML 中的属性。 您在此设置的值为窗口小部件的缺省值。
  2. 在窗口小部件定义中,指定您希望窗口小部件支持的方式:
    supportedModes="view edit config personalize"
    view 方式是必填方式。edit 方式是除系统窗口小部件(例如,用于定制主题的窗口小部件)之外的所有窗口小部件的必填方式。
  3. 对于每个支持的方式,添加内容部分:
    <iw:content mode="personalize">
    <![CDATA[
    // content here
    ]]>;
    </iw:content>
    使用 _WID_ 标记作为窗口小部件内容中属性元素的前缀。例如,天气窗口小部件标题可能如下所示:<h1 id="_WID_weatherTitle">Local Weather</h1>。当浏览器呈现窗口小部件时,代码会使用特定窗口小部件实例的标识替换 _WID_。这表示如果指定的页面上有窗口小部件的多个实例,那么使用 getElementById() 检索特定元素不会失败,因为多个元素具有同一标识。您应该分配成员存储 _WID_ 值,因为代码经常会在检索属性时复用它。
  4. 对于每个受支持的方式,请在 JavaScript 中定义功能。 例如,在 personalize 方式下,作为整数值的具有邮政编码的控件代码可能如下所示:
    onPersonalize: function() {
    	var att = this.iContext.getiWidgetAttributes();
    		var zipCode = att.getItemValue("zipCode");
    		if (zipCode) {
    				document.getElementById(this.domID + "zipCode").value = parseInt(zipCode);
    	}
    }

    在该示例代码中,domID 是存储 _WID_ 值的成员。即,this.domID 等于 "_" + this.iContext.widgetId + "_"

  5. 要保留个性化,请包含设置窗口小部件属性及保存该更改的代码。 保存个性化表示当用户重新访问页面时,窗口小部件的外观与用户离开页面时相同。
    提示: 如果其他方式也会保存属性更改,那么您可以创建公用 save 函数,并从每个方式调用此函数。例如,使用 save 函数的代码可能如下所示:
    var att = this.iContext.getiWidgetAttributes();
    		var zipCode = document.getElementById(this.domID + "zipCode");
    		att.setItemValue("zipCode", ""+zipCode, false);
    		att.save();