zkフレームワークにupload = true属性コンポーネントを持つテキストボックスとボタンがあり、アップロードダイアログがポップアップする前に、テキストボックスの値が空かどうかを制御したいと思います。テキストボックスのonChangeイベントを試して、値に応じてボタンを無効および有効にしました 問題は、別の場所をクリックする前にボタンが有効/無効になっていないことです。つまり、テキストボックスにテキストを書き込んでボタンをクリックしても、まだ無効のままです。2回目のクリックの後、アクティブになります。
3 に答える
onChangeの代わりにonChangingを使用する必要があります。また、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>
ジャワ
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());
}
}
これでも
<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() );
}
}
、Textbox
、または の有効/無効プロパティなどを制御するために使用される別のコンポーネントがある場合Combobox
、一般的なアプローチは、そのようなコンポーネントのイベントを使用することです。ZK はこのイベントを特別な方法で扱います。Spinner
Button
onChanging
したがって、次のようになります。
<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()