我在 zk 框架中有一个带有 upload = true 属性组件的文本框和一个按钮,我想在弹出上传对话框之前控制文本框的值(如果它为空)。我尝试了文本框上的 onChange 事件以根据值禁用和启用按钮问题是在单击其他位置之前未启用/禁用按钮。也就是说,如果我在文本框中写了一些文本并单击按钮后,它仍然保持禁用状态。第二次点击后,它被激活。
问问题
2850 次
3 回答
1
您应该使用onChanging而不是onChange。此外,只有 ZK 端解决方案正常工作,但 ZK + Java 端解决方案无法正常工作。
ZK 端解决方案(工作)
<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 解决方案(不能正常工作)
ZK
<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>
JAVA
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());
}
}
于 2013-04-06T07:17:06.743 回答
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>
正在工作,这不推荐用于生产。看到这个。
我的解决方案
public class MyClass extends SelectorComposer<Window> {
@Wire
private Button btn;
@Listen("onChanging = #myTextBoxID")
public void onChanging(ChangeingEvent ev) {
btn.setDisabled( ev.getValue().isEmpty() );
}
}
于 2013-04-07T15:37:23.970 回答
0
当您有一个Textbox
、Combobox
或Spinner
其他组件来控制诸如 a 的启用/禁用属性之类的东西时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
value 字段之前触发,因此,在事件处理程序上获取时,您将获得旧值。同样在Event
类中,新值字段是私有且不可访问的,因此该getValue()
方法返回旧值。而是在调用InputEvent
时首选新值。getValue()
于 2014-06-20T08:39:39.143 回答