动态名称为

时间:2016-09-09 14:50:14

标签: jsp dojo widget

我已经创建了一个自定义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}与另一个${}包围,则无法正确解析。

有没有办法解决这个问题?

根据评论要求澄清:

  1. 所需行为:我想在编写第4个代码段时使用Dojo生成第一个HTML代码段。
  2. 可重现的问题:我主要获得了正确的代码段,但是当Dojo解析$ {fieldName}时,它变成了machineName,这就是我想要的s:set,但是在Combobox中,当它作为值,它被写为字符串文字machineName。我想调整我的第2和第3个代码段而不是value: 'machineName',它会读取value:'${machineName}',就像在第一个代码段中一样,它会检索s:set中的请求范围参数集。
    本质是我的struts2动作中的machineSearchView.name的当前值应该在组合框中预先选择。这就是我想要实现的目标。但是,我也想在同一个JSP页面中使用这个元素的多个实例,我认为这意味着我不能让它们都具有相同的名称。

1 个答案:

答案 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>

然而,由于业务沟通不畅,这不是我最终会采用的解决方案。