2016-09-09 13 views
0

私は、単一のサイズのコンボボックスであることを意図したカスタムDojo 1.9ウィジェットを作成しました。ここで、宣言的にドロップダウンを使用して任意のdojoウィジェットを挿入できます。動的名を持つサーブレット・プロパティ

これは私がこのウィジェットを置き換えるために望んでいる道場のコンボボックスの例です:

<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%で動作し、完全に動作させることができると私に期待しています。私の大きなバグは、これで展開を開始する前に、私が望むものの外観を持っているので、ドロップダウン値要素の問題です。

ご覧のとおり、私は検索対象のマシンの名前を取得し、それを私のコンボボックスの値に渡すリクエストスコープサーブレットプロパティを持っています。 Dojoウィジェットの複数のインスタンスをページに追加できるようにする必要があるため、このサーブレット・プロパティーの名前を変数にする必要があります。しかし、Dojoのコンボボックス値では、dojoプロパティの値として作成したこのプロパティを使用する必要があります。だから私は基本的には、このページに「Xという名前のJSPプロパティを挿入する」と言いたい。ここでX = ${fieldName}はDojoによって生成されたものだ。ただし、これは、すでにページに送信され、Dojoで処理された後にサーブレットを生成することを意味します。

私はstruts2 get property with dynamic value in jsp、そこにリンクの質問のような他の回答を、チェックしましたが、問題は、それらのすべてが<s:text>または<s:property>のいずれかを使用することですが、道場は、それらがdata-dojo-propsタグにあるウィジェットを解析することはできません。 ${fieldName}を別の${}で囲むと、正しく解析されません。

この問題を解決する方法はありますか?


コメントで要求されるように明確化:

  1. 望ましい行動:私は、私は第四スニペットを書くとき、最初のHTMLコードスニペットを生成するために道場を使用したいです。
  2. 再現可能な問題:ほとんどの場合、正しいスニペットが得られますが、Dojoによって$ {fieldName}が解析されると、それはmachineNameになります。これはs:setでは必要ですが、Comboboxでは値は、文字列リテラルのmachineNameとして書き込まれます。 value: 'machineName'の代わりに2番目と3番目のスニペットを調整したい場合は、value:'${machineName}'と表示されます。最初のスニペットと同様に、s:setのrequest-scopeパラメータセットを取得します。
    私のstruts2アクション内のmachineSearchView.nameの現在の値は、コンボボックスであらかじめ選択されている必要があります。それが私が達成したいことです。しかし、私は同じJSPページ内でこの要素の複数のインスタンスを使用したいと思っています。つまり、それらのインスタンスをすべて同じ名前にすることはできません。

答えて

0

いくつかのテストを行った後、私は私の問題を解決しました。実際には、私は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> 

しかし、ビジネスの連絡ミスで、これは私が一緒に行くことになる解決策ではありません最終的には。

関連する問題