需要AjaxCallDecorator根据下拉值有条件地显示

时间:2012-09-25 14:57:06

标签: wicket

我有一个下拉列表,我正在使用AjaxCallDecorator。目前,当您从下拉列表中选择一个地址时,我会使用一些ajax对该地址运行一些检查。我在下拉列表旁边使用一个微调器图标让用户知道发生了什么事。下拉列表中的一个选项是“手动输入地址”。当他们选择这个时,我不希望AjaxCallDecorator进行装饰。它不会弹出很长时间(可能是四分之一秒),但我不希望它出现。

我无法弄清楚如何根据用户在下拉菜单中选择的内容有条件地显示装饰器。 getAjaxCallDecorator仅用于确定要使用的装饰器,我很确定它只在初始化或页面加载时调用一次。每次选择新的下拉选项时都不会调用它。

感谢。

(对不起,应该包括我正在使用wicket 1.4.20)

1 个答案:

答案 0 :(得分:2)

首先想到的解决方案是检查用户在JavaScript代码中直接选择的选项。

这是Wicket 1.5的代码(因为它是AjaxCallDecorator的最后一个版本):

@Override
protected IAjaxCallDecorator getAjaxCallDecorator() {
    return new AjaxCallDecorator() {

        @Override
        public CharSequence decorateScript(Component c, CharSequence script) {
            return "if (" + shouldUseDecoratorScript() + ") { /* Show the spinner icon */ } " + script;
        }

        @Override
        public CharSequence decorateOnSuccessScript(Component c, CharSequence script) {
            return "if (" + shouldUseDecoratorScript() + ") { /* Hide the spinner icon */ } " + script;
        }

        @Override
        public CharSequence decorateOnFailureScript(Component c, CharSequence script) {
            return "if (" + shouldUseDecoratorScript() + ") { /* Hide the spinner icon */ } " + script;
        }

        private CharSequence shouldUseDecoratorScript() {
            return "this.value !== \"" + enterAddressManuallyItem.getId() + "\"";
        }
    };
}

这里的enterAddressManuallyItem是对应于“手动输入地址”选项的项目。我假设它有getId()getter,你使用像

这样的东西
new ChoiceRenderer<DropDownChoiceItem>("text", "id")

作为DropDownChoice构造函数的最后一个参数。

也许,有一个更好的解决方案。