2017-02-10 9 views
0

Я пытаюсь реализовать простую раскрывающуюся панель, которая обновляется на основе выбора другого раскрывающегося списка с помощью Wicket 6.19. Пока что так хорошо, выпадающие работы, как они должны. Проблема в том, что я использую настраиваемый компонент выбора выпадающего списка, где в методе renderHead вызывается метод uniform().Использование uniform() в Wicket генерирует несколько экземпляров при вызове метода modelChanged

@Override 
public void renderHead(IHeaderResponse response) { 
    super.renderHead(response); 
    response.render(OnDomReadyHeaderItem.forScript("$('#" + getMarkupId(true) + "').uniform();")); 
} 

Это Methode (она была написана кем-то другим) всегда вызывается, когда я призываю modelChanged() Methode моего выпадающего списка, чтобы обновить. Таким образом, новый элемент div создается каждый раз, когда вызывается метод renderHead, результаты которого на экране в тени дополняют компонент.

Generated HTML after changing the selection of the dropdown several times

Когда я удалить код с однотонным, addional дивы не генерируются, но выпадающий имеет неправильный тип. Я не знаком с однородным методом. Я бы очень признателен за вашу помощь, как исправить это.

ответ

0

Я знаю, что прошло довольно много времени с моего вопроса, но в последнее время я пришел к решению. Я знаю, что это, вероятно, не лучшее решение, но оно работает для меня, и, возможно, это помогает кому-то, кто спотыкается по одной и той же проблеме.

В этом решении я удаляю элемент div и дочернего элемента перед повторной униформой. Таким образом, у меня есть только один div после того, как я вызову единый метод.

@Override 
public void renderHead(IHeaderResponse response) { 
     super.renderHead(response); 

     if(hasBeenRendered()) 
      response.render(OnDomReadyHeaderItem.forScript("$('#" + getMarkupId(true) + "').parent().replaceWith(function() {return $('select', this);});")); 

     response.render(OnDomReadyHeaderItem.forScript("$('#" + getMarkupId(true) + "').uniform();"));  
} 
0

Вы можете обернуть код в renderHead() с помощью if (!hasBeenRendered()) {...}. Таким образом, это будет uniform это только в первый раз.

+0

Я пробовал, но в этом случае, после того как я изменил выбор своего первого раскрывающегося списка, пользовательский стиль выпадающего меню больше не применялся. –

+0

Что я делаю при определенном изменении, так это то, что я очищаю список с элементами второго выпадающего списка и устанавливаю для элемента модели выбора значение null. В другом изменении я снова заполняю список и устанавливаю модель выбора. –

+0

Вам либо нужен 'deuniform()' метод, который 'destroy' JS-виджет, если он есть, либо вам нужно полностью удалить всю DOM и добавить новый DropDownChoice, который будет «единообразным», поскольку он не имеет были представлены ранее. –