0

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

4

3 回答 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

当您有一个TextboxComboboxSpinner其他组件来控制诸如 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事件在将新值分配给Textboxvalue 字段之前触发,因此,在事件处理程序上获取时,您将获得旧值。同样在Event类中,新值字段是私有且不可访问的,因此该getValue()方法返回旧值。而是在调用InputEvent时首选新值。getValue()

于 2014-06-20T08:39:39.143 回答