我已经创建了一个自定义Dojo 1.9小部件,它旨在成为一个通用的组合框,我可以通过声明方式插入任何dojo小部件,所以在我的jsp页面中。
这是一个dojo Combobox的例子,我希望用这个Widget取代:
<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属性的值。所以我基本上想说“将JSP属性插入到名为X的页面中”,其中X = ${fieldName}
由Dojo生成。但是,这意味着在已经发送到页面并由Dojo处理之后生成servlet。
我已经检查了其他答案,例如struts2 get property with dynamic value in jsp及其中的链接问题,但问题是那些都使用<s:text>
或<s:property>
,但Dojo无法解析小部件,它们位于data-dojo-props
标记中。如果我只是尝试将${fieldName}
与另一个${}
包围,则无法正确解析。
有没有办法解决这个问题?
根据评论要求澄清:
value: 'machineName'
,它会读取value:'${machineName}'
,就像在第一个代码段中一样,它会检索s:set中的请求范围参数集。答案 0 :(得分:0)
经过一些测试后,我找到了解决问题的方法。实际上,我已经将servlet转换逻辑拆分为页面本身,而不是在Dojo中尝试这样做。
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>
<div data-dojo-type="${dropDownType}" data-dojo-attach-point="dropDownNode"
data-dojo-props="store:${dataStoreSearchProp}, name: '${searchViewFieldName}', value: '${valueSearchProp}'" 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", "dojo/parser",
"dijit/form/ComboBox", "dijit/form/Select",
"dijit/form/FilteringSelect"
], function(declare, _WidgetBase, _TemplatedMixin, template,
_WidgetsInTemplateMixin, Memory, parser) {
return declare([ _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin ], {
templateString : template,
fieldName : "",
searchProps : "",
dataSourceData : "",
dataStoreSearchProp: "",
NameSearchProp:"",
valueSearchProp:"",
dropDownType : "",
searchViewFieldName : "",
});
});
如何使用:
<s:set var='machineName' value='machineSearchView.name'
scope='request'>
</s:set>
<div data-dojo-type="js/widgets/ExpandableSearchComponent"
data-dojo-id="operatingSystemStore"
data-dojo-props="dataSourceData: '<s:property value='%{getNameJsonString()}'/>', dataStoreSearchProp: 'machineNameDataStore', valueSearchProp: '${machineName}', dataStoreId:'machineNameDataStore', dropDownType: 'dijit/form/ComboBox', searchViewFieldName: 'machineSearchView.name'"></div>
</td>
然而,由于业务沟通不畅,这不是我最终会采用的解决方案。