Apache Wicket: обновить значение метки после нажатия кнопки

Я начал изучать веб-фреймворк Apache Wicket, и у меня возникли трудности с выполнением задачи.

Если вы можете видеть из прикрепленного изображения, я пошел на http://www.wicket-library.com/wicket-examples-6.0.x/echo/,

попробовать эту базовую функциональность формы ввода.

У меня такой вопрос: я не хочу, чтобы изначально что-либо отображалось в поле "Метка", но как только была нажата кнопка "Установить сообщение", я хочу обновить значение "Метка". Как я могу это сделать? Спасибо

Обновлено:

Код в echo.java показан ниже. PropertyModel присоединяется к метке, которая обновляет значение.

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.wicket.examples.echo;

import org.apache.wicket.examples.WicketExamplePage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.PropertyModel;


/**
 * The simplest form application possible. Just prints any user input to a label.
 * 
 * @author Eelco Hillenius
 */
public class Echo extends WicketExamplePage
{
    private String message = "[type your message to the world here]";

    /**
     * Constructor.
     */
    public Echo()
    {
        // This model references the page's message property and is
        // shared by the label and form component
        PropertyModel<String> messageModel = new PropertyModel<String>(this, "message");

        // The label displays the currently set message
        add(new Label("msg", messageModel));

        // Add a form to change the message. We don't need to do anything
        // else with this form as the shared model is automatically updated
        // on form submits
        Form<?> form = new Form("form");
        form.add(new TextField<String>("msgInput", messageModel));
        add(form);
    }

    /**
     * @return the message
     */
    public String getMessage()
    {
        return message;
    }

    /**
     * @param message
     *            the message to set
     */
    public void setMessage(String message)
    {
        this.message = message;
    }
}

HTML-файл выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
<head>
    <title>Wicket Examples - echo</title>
    <link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
    <span wicket:id="mainNavigation"/>

    <form wicket:id="form">
        <input type="text" wicket:id="msgInput" value="" size="50" />
        <input type="submit" value="set message" />
    </form>
    <span wicket:id="msg" id="msg">Message goes here</span>

</body>
</html>

1 ответ

Решение

Попробуй это:

add(new Label("msg", messageModel)) {
  @Override public boolean isVisible() {
    return !messageModel.getObject().equals(message);
  }
};

Текстовое поле должно знать, когда оно должно быть отображено. Обратите внимание, что вам нужно установить setOutputMarkupId(true) а также setOutputMarkupPlaceholderTag(true) на Label если вы хотите сделать компонент видимым через Ajax, то есть submit компонент является, например, AjaxSubmitButton,

При выполнении более сложной задачи, чем String Для сравнения лучше позвонить setVisible от переопределения onConfigure Метод, как указано в комментариях. isVisible может вызываться много раз на этапе рендеринга, так что вы хотите избежать вычислений. Это будет выглядеть следующим образом:

add(new Label("msg", messageModel)) {
  @Override protected void onConfigure() {
    super.onConfigure();
    setVisible(!messageModel.getObject().equals(message));
  }
};

Никогда не забывайте звонить super метод, хотя.

Чтобы улучшить читаемость кода, я лично предпочитаю переопределять isVisible метод для простых задач, таких как String сравнение вам требуется. JIT-компилятор обычно заботится обо всем остальном.

Другие вопросы по тегам