Гобелен 5 добавить действие в меню выбора - PullRequest
2 голосов
/ 21 июня 2011

Я пытаюсь добавить действие в меню выбора гобелена. В настоящее время я генерирую меню выбора, вводя selectModelFactory и предоставляя ему список из запроса гибернации. Затем я хочу добавить дополнительный пункт в меню, который говорит что-то вроде «+ Добавить новый элемент», когда данные варианты не представляют желаемый выбор. При выборе + Добавить новый элемент я попытался использовать метод onValueChanged для захвата нового объекта и возврата зоны. Я не смог сделать эту работу. Может ли кто-то указать мне в правильном направлении. Мне нужно также предотвратить передачу этого объекта в базу данных, что заставляет меня думать, что я не должен добавлять его в существующий список.

void onPrepare() {
    List<MyClass> results = session.createCriteria(MyClass.class).list();

    MyClass tempObject = new MyClass();
    tempObject .setName("+ Add New Item");
    results.add(tempObject);
    selectModel = selectModelFactory.create(results, "label");
}

public Object onValueChanged(MyClass myClass) {
    if(myClass!= null && myClass.getName().equals("+ Add New Item")) {
        return myZone.getBody();
    }
    return null;
}

Ответы [ 2 ]

2 голосов
/ 25 июня 2011

Посмотрите на этот рабочий пример . Наименование вашего метода передачи событий неверно и должно быть onValueChangedNameOfYourSelect(MyClass value). Или я предпочитаю использовать аннотацию OnEvent .

1 голос
/ 28 июня 2011

Здравствуйте, смотрите nabble http://tapestry.1045711.n5.nabble.com/T5-Select-Menu-with-Other-Option-td4520881.html#a4529383 список рассылки для обсуждения.Следующее в конечном итоге оказалось решением, однако предотвращение сохранения варианта «Другое» представляло другие сложности.

@Property
private Funding funding;

@Property
@Persist
private SelectModel fundingModel;

@InjectComponent
private Zone fundingZone;

final private static Funding NEW_FUNDING = new Funding();
final private static String NEW_FUNDING_ID = "-1";

void onPrepare() {
    fundings = session.createCriteria(Funding.class).list();
    NEW_FUNDING.setName("+ Other");
    fundings.add(NEW_FUNDING);

    fundingModel = selectModelFactory.create(fundings, "label");

}

@CommitAfter
void onSuccess() {
    //you would want to add some sort of logic to prevent the "Other" object from being commited.
}

public ValueEncoder<Funding> getEncoder() {
    final ValueEncoder<Funding> encoder = valueEncoderSource.getValueEncoder(Funding.class);
    return new FundingValueEncoder(encoder);
}

final private static class FundingValueEncoder implements ValueEncoder<Funding> {
    final private ValueEncoder<Funding> delegate;

    public FundingValueEncoder(ValueEncoder<Funding> delegate) {
        this.delegate = delegate;
    }

    public String toClient(Funding value) {
        if (value == NEW_FUNDING) {
            return NEW_FUNDING_ID;
        } else {
            return delegate.toClient(value);
        }
    }

    public Funding toValue(String clientValue) {
        if (NEW_FUNDING_ID.equals(clientValue))  {
            return NEW_FUNDING;
        } else {
            return delegate.toValue(clientValue);
        }
    }
}

public Object onValueChanged(Funding funding) {
    if(funding == NEW_FUNDING) {
        return fundingZone.getBody();
    }
    return null;
}
...