【发布时间】:2016-09-09 14:50:13
【问题描述】:
我创建了一个自定义 Dojo 1.9 小部件,它旨在成为一个万能的组合框,我可以在其中以声明方式插入任何带有下拉列表的 dojo 小部件,因此在我的 jsp 页面中。
这是我希望用这个 Widget 替换的 dojo Combobox 示例:
<div data-dojo-type="dojo/store/Memory"
data-dojo-id="machineNameStore"
data-dojo-props="<s:property value='%{getNameJsonString()}'/>"></div>
<s:set name="MachineName" value="machineSearchView.name"
scope="request"></s:set>
<div data-dojo-type="dijit/form/ComboBox"
data-dojo-props="store:machineNameStore, searchAttr:'name', value:'${MachineName}'"
name="machineSearchView.name" id="machineSearchView.name" />
这是我的小部件的 html 代码:
<div class="${baseClass}">
<div data-dojo-type="dojo/store/Memory" data-dojo-attach-point="memoryNode"
data-dojo-id="${dataStoreId}"
data-dojo-props="${dataSourceData}"></div>
<s:set name="${fieldName}" value="${searchViewFieldName}" scope="request"> <s:set>
<div data-dojo-type="${dropDownType}" data-dojo-attach-point="dropDownNode"
data-dojo-props="store:${dataStoreId}, searchAttr:'${searchAttrName}', value: '${fieldName}'"
name="${searchViewFieldName}" id="${searchViewFieldName}" ></div>
</div>
这是我的小部件的 javascript 代码:
/**
* Javascript for ExpandableSearchComponent
*/
define([ "dojo/_base/declare", "dijit/_WidgetBase", "dijit/_TemplatedMixin",
"dojo/text!./templates/ExpandableSearchComponent.html",
"dijit/_WidgetsInTemplateMixin", "dojo/store/Memory",
"dijit/form/ComboBox", "dijit/form/Select",
"dijit/form/FilteringSelect"
], function(declare, _WidgetBase, _TemplatedMixin, template,
_WidgetsInTemplateMixin, Memory) {
return declare([ _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin ], {
templateString : template,
fieldName : "",
dataSourceData : "",
dropDownType : "",
searchAttrName : "",
searchViewFieldName : ""
});
});
这就是页面中小部件的调用方式:
<div data-dojo-type="js/widgets/ExpandableSearchComponent"
data-dojo-id="operatingSystemStore"
data-dojo-props="dataSourceData: '<s:property value='%{getNameJsonString()}'/>',
fieldName:'machineName' , dataStoreId: 'machineNameDataStore',
dropDownType: 'dijit/form/ComboBox', searchAttrName: 'name',
searchViewFieldName: 'machineSearchView.name'"></div>
这适用于大约 90%,让我希望我可以让它完全发挥作用。在我开始对此进行扩展之前,我现在的大错误是下拉值元素的问题,因此它具有我想要的外观。
如您所见,我有一个请求范围的 servlet 属性,它采用我正在搜索的机器的名称并将其传递给我的组合框的值。我需要能够将我的 Dojo Widget 的多个实例添加到我的页面,所以我需要能够使这个 servlet 属性的名称成为一个变量。但是,在我的 Dojo 组合框值中,我需要使用我创建的这个属性作为 dojo 属性的值。所以我本质上想说“在这个页面中插入一个名为 X 的 JSP 属性”,其中 X = ${fieldName} 由 Dojo 生成。然而,这意味着在它已经被发送到页面并由 Dojo 处理之后生成一个 servlet。
我检查了其他答案,例如 struts2 get property with dynamic value in jsp 和其中的链接问题,但问题是那些都使用 <s:text> 或 <s:property>,但 Dojo 无法解析那些在data-dojo-props 标签。如果我只是尝试用另一个 ${} 包围 ${fieldName},则无法正确解析。
有没有办法解决这个问题?
根据 cmets 的要求进行澄清:
- 期望的行为:我想在编写第 4 个 sn-p 时使用 Dojo 生成第一个 HTML 代码 sn-p。
- 可重现的问题:我得到了正确的 sn-p,但是当 Dojo 解析 ${fieldName} 时,它变成了 machineName,这是我在 s:set 中想要的,但是在 Combobox 中,当输入它时作为值,它被写为字符串字面量 machineName。我想调整我的第二个和第三个 sn-p,而不是
value: 'machineName',它读取value:'${machineName}',就像在第一个 sn-p 中一样,因此它检索 s:set 中设置的请求范围参数。
本质是我的struts2动作中machineSearchView.name的当前值应该在combobox中预选。这就是我想要达到的目标。但是,我还想在同一个 JSP 页面中使用该元素的多个实例,我认为这意味着我不能让它们都具有相同的名称。
【问题讨论】: