1

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

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

谢谢。

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

4

1 回答 1

3

想到的第一个解决方案是直接在 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 构造函数的最后一个参数。

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

于 2012-09-25T16:07:05.277 回答