zk - fileupload之前的java文本框验证

时间:2013-04-05 17:45:39

标签: java validation upload zk

我在zk框架中有一个文本框和一个带有upload = true属性组件的按钮,我希望在弹出上传对话框之前控制文本框值,如果它是空的。我在文本框上尝试onChange事件以根据值禁用和启用按钮问题是在单击其他位置之前未启用/禁用按钮。也就是说,如果我在文本框中写入一些文本并在点击按钮后,它仍然是残缺的。第二次点击后,它会被激活。

3 个答案:

答案 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解决方案(无法正常工作

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());
    }
}

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

当您拥有TextboxComboboxSpinner或其他用于控制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()时,首选新值。