下面是我写的tapestry组件的源代码,欢迎大家使用
它实现了类似根据所选省过滤其下级市,选市过滤县的功能,大家只要正确构造idynamicpropertyselection就可以实现N级的关联下拉框操作,欢迎大家使用

[code:1]public abstract class DynamicPropertySelection extends AbstractFormComponent {

public abstract DynamicPropertySelection getParent();

public abstract IDynamicPropertySelectionModel getModel();

public abstract Object getValue();

public abstract void setValue(Object value);

public abstract boolean isDisabled();

private String selfId = null;

private IScript script = null;

protected void finishLoad() {
IEngine engine = getPage().getEngine();
IScriptSource source = engine.getScriptSource();
IResourceLocation specLocation = getSpecification().getLocation()
.getResourceLocation();

String scriptPath = "DynamicPropertySelection.script";
IResourceLocation scriptLocation = specLocation
.getRelativeLocation(scriptPath);
script = source.getScript(scriptLocation);
}

protected void renderComponent(IMarkupWriter writer,
IRequestCycle requestCycle) {
IForm form = getForm(requestCycle);
this.selfId = form.getElementId(this);

if (form.isRewinding()) {
if (isDisabled()) {
return;
}
String optionValue = requestCycle.getRequestContext().getParameter(
selfId);
Object value = optionValue;
setValue(value);
return;
}

writer.begin("select");
writer.attribute("name", selfId);
if (isDisabled()) {
writer.attribute("disabled", true);
}
renderInformalParameters(writer, requestCycle);
if (getParent() == null) {
writer.println();
String key = (String) getModel().getKeys().get(0);
IPropertySelectionModel propertySelectionModel = getModel()
.getPropertySelectionModel(key);
for (int i = 0; i < propertySelectionModel.getOptionCount(); i++) {
Object option = propertySelectionModel.getOption(i);

writer.begin("option");
writer.attribute("value", propertySelectionModel.getValue(i));

if (propertySelectionModel.getValue(i).equals(getValue())) {
writer.attribute("selected", "selected");
}
writer.print(propertySelectionModel.getLabel(i));
writer.end();
writer.println();
}
}
writer.end();

Body body = Body.get(requestCycle);

Map symbols = new HashMap();
symbols.put("dps", this);
script.execute(requestCycle, body, symbols);
}

public String getParentId() {
return getParent() == null ? null : getParent().getId();
}

public String getSelfId() {
return this.selfId;
}

public String getSelfModelName() {
return getSelfId() + "_selectModels";
}

public String getLessChar() {
return "<";
}

public String getScriptModel() {
StringBuffer stringBuffer = new StringBuffer();
String selectModelsName = getSelfModelName();
stringBuffer.append("var ").append(selectModelsName).append(
" = new Array(").append(getModel().getPropertySelectionCount())
.append(");\n");
Iterator iter = getModel().getKeys().iterator();
int j = 0;
while (iter.hasNext()) {
String key = (String) iter.next();
IPropertySelectionModel propertySelectionModel = getModel()
.getPropertySelectionModel(key);
stringBuffer.append("var optionModels = new Array(").append(
propertySelectionModel.getOptionCount()).append(");\n");
for (int i = 0; i < propertySelectionModel.getOptionCount(); i++) {
stringBuffer.append("optionModels[").append(i).append(
"] = new OptionModel('").append(
propertySelectionModel.getValue(i)).append("','")
.append(propertySelectionModel.getLabel(i)).append(
"');\n");
}
stringBuffer.append(selectModelsName).append("[").append(j++)
.append("] = new SelectModel('").append(key).append(
"',optionModels);\n");
}

return stringBuffer.toString();
}

}[/code:1]
js文件
[code:1]function OptionModel(value,text) {
this.value = value;
this.text = text;
}
function SelectModel(key,optionModels) {
this.key = key;
this.optionModels = optionModels;
}
function updateSelectOptions(selectObject,optionModels,selected) {
while(selectObject.length > 0) {
selectObject.remove(selectObject.length - 1);
}
for(var i = 0 ;i < optionModels.length ; i ++) {
var oOption = document.createElement("OPTION");
oOption.value = optionModels[i].value;
oOption.text = optionModels[i].text;
if(oOption.value == selected) {
oOption.selected = true;
}
selectObject.add(oOption);
}
selectObject.fireEvent("onchange");
}[/code:1]
script文件
[code:1]
<script>


<include-script resource-path="DynamicPropertySelection.js"/>

<input-symbol key="dps" class="DynamicPropertySelection" required="yes"/>

<set key="form" expression="dps.form.name"/>
<set key="parentId" expression="dps.parentId"/>
<set key="selfId" expression="dps.selfId"/>
<set key="selfValue" expression="dps.value"/>
<set key="selfModelName" expression="dps.selfModelName"/>
<set key="lessChar" expression="dps.lessChar"/>

<let key="parentSelect">
document.${form}.${parentId}
</let>

<let key="selfSelect">
document.${form}.${selfId}
</let>

<body>
${dps.scriptModel}
<if expression="parentId != null">
function cmd_${parentId}_onchange(){
${parentSelect}.onchange = cmd_update_${selfId};
cmd_update_${selfId}();
}
function cmd_update_${selfId}(){
var parentValue = ${parentSelect}(${parentSelect}.selectedIndex).value;
for(var i = 0 ; i ${lessChar} ${selfModelName}.length; i ++) {
var key = ${selfModelName}[i].key;
if(key == parentValue) {
updateSelectOptions(${selfSelect},${selfModelName}[i].optionModels, '${selfValue}');
break;
}
}
}
</if>
</body>

<initialization>
<if expression="parentId != null">
cmd_${parentId}_onchange();
</if>
</initialization>

</script>[/code:1]

[code:1]public interface IDynamicPropertySelectionModel {

public List getKeys();

public int getPropertySelectionCount();

public IPropertySelectionModel getPropertySelectionModel(String key);

}[/code:1]
评论
发表评论

您还没有登录,请登录后发表评论

samuel_bai
搜索本博客
最近加入圈子
最新评论
评论排行榜