我在zk框架中有一个文本框和一个带有upload = true属性组件的按钮,我希望在弹出上传对话框之前控制文本框值,如果它是空的。我在文本框上尝试onChange事件以根据值禁用和启用按钮问题是在单击其他位置之前未启用/禁用按钮。也就是说,如果我在文本框中写入一些文本并在点击按钮后,它仍然是残缺的。第二次点击后,它会被激活。
答案 0 :(得分:1)
您应该使用 onChanging 而不是 onChange 。此外,只有ZK端解决方案正常工作,但ZK + Java端解决方案无法正常工作。
ZK-Side解决方案(正常工作)
<zk>
<textbox>
<attribute name="onChanging">
if ( event.getValue().length() > 0 )
but.setDisabled( false );
else
but.setDisabled( true );
</attribute>
</textbox>
<button id="but" disabled="true" upload="true,maxsize=300" label="Up" />
</zk>
ZK + Java解决方案(无法正常工作)
<window title="Hello World!!" border="normal" width="200px" apply="com.UploadFile">
<textbox id="value" />
<button id="but" disabled="true" upload="true,maxsize=300" label="Up" />
</window>
public class UploadFile extends GenericForwardComposer<Window> {
private static final long serialVersionUID = 1L;
private Textbox value;
private Button but;
public void onChanging$value() {
if ( value.getValue().length() > 0 )
but.setDisabled( false );
else
but.setDisabled( true );
}
public void onClick$but() {
alert(value.getValue());
}
}
答案 1 :(得分:0)
即使这个
<zk>
<textbox>
<attribute name="onChanging">
if ( event.getValue().length() > 0 )
but.setDisabled( false );
else
but.setDisabled( true );
</attribute>
</textbox>
<button id="but" disabled="true" upload="true,maxsize=300" label="Up" />
</zk>
正在运行,不建议用于生产。请参阅this。
我的解决方案
public class MyClass extends SelectorComposer<Window> {
@Wire
private Button btn;
@Listen("onChanging = #myTextBoxID")
public void onChanging(ChangeingEvent ev) {
btn.setDisabled( ev.getValue().isEmpty() );
}
}
答案 2 :(得分:0)
当您拥有Textbox
,Combobox
,Spinner
或其他用于控制Button
的启用/停用属性之类的组件时,常见的方法是使用此类组件的onChanging
事件。 ZK以特殊方式对待此事件。
所以我们有:
<textbox id="myTextbox" />
<button id="myButton" disabled="true" />
如前所述,所有在MVC环境中获取值的常见尝试都不起作用。
@Listen("onChanging = #myTextbox")
public void onChangingTextbox(Event event){
String byGetText = myTextbox.getText(); //Will give you the old value
String byGetValue = myTextbox.getValue(); //Will still give the old value
String byEvent = event.getValue(); //Yet another way to get the old value
if(!byGetText.equals("")) myButton.setDisabled(false)
else myButton.setDisabled(true);
if(!byGetValue.equals("")) myButton.setDisabled(false)
else myButton.setDisabled(true);
if(!byEvent.equals("")) myButton.setDisabled(false)
else myButton.setDisabled(true);
//All of the above won't work when the Textbox is cleared since the
//referred value is the old value.
}
解决方案就是这样。我们必须使用InputEvent
代替Event
来获取新值:
@Listen("onChanging = #myTextbox")
public void onChangingTextbox(InputEvent event){
String byEvent = event.getValue(); //This will give you the new value
//This control will behave as wanted
if(!byEvent.equals("")) myButton.setDisabled(false)
else myButton.setDisabled(true);
}
在将新值赋给onChanging
值字段之前触发Textbox
事件,因此,当在事件处理程序上获取时,您将获得旧值。同样在Event
类中,新值字段是私有且无法访问的,因此getValue()
方法返回旧值。而在InputEvent
中,当调用getValue()
时,首选新值。