|
|
|
Wicket 6 ( очистка полей формы )
|
|||
|---|---|---|---|
|
#18+
Всем доброго времени суток. Использую Wicket 6.11.0. На страницу добавил собственный компонент - диалоговое окно. Диалоговое окно реализовано на основе Twitter Bootstrap Modal Window. Его темплейт : BaseDialog.html <html xmlns:wicket=" http://wicket.apache.org"> <body> <wicket:panel> <div wicket:id="myModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">X</button> <h4 id="myModalLabel">Modal header</h4> </div> <div wicket:id="childContent" class="modal-body container"> <form wicket:id="dlgForm"> <div wicket:id="feedback"></div> <wicket:child /> </form> </div> <div class="modal-footer"> <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button> <button class="btn" wicket:id="sbmtBtn">Save changes</button> </div> </div> </wicket:panel> </body> </html> Джава класс : BaseDialog.java package com.nauhau.components.BaseDialog; import java.util.HashMap; import java.util.Map; import org.apache.wicket.AttributeModifier; import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.html.TransparentWebMarkupContainer; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.StatelessForm; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.markup.html.panel.Panel; import org.odlabs.wiquery.core.javascript.JsScope; import de.agilecoders.wicket.core.Bootstrap; public class BaseDialog extends Panel { private WebMarkupContainer dialogDiv; private AbstractDefaultAjaxBehavior beforeOpen; private IndicatingAjaxButton sbt; private Form<Void> form; private FeedbackPanel fpanel; /** * */ private static final long serialVersionUID = -7300515046330284598L; @SuppressWarnings("serial") public BaseDialog(String id) { super(id); this.dialogDiv = new TransparentWebMarkupContainer("myModal"); this.dialogDiv.setOutputMarkupId(true); this.dialogDiv.setMarkupId("myModal"); this.add(dialogDiv); form = new Form<Void>("dlgForm"); form.setOutputMarkupId(true); form.setMarkupId("dlgForm"); dialogDiv.add(form); TransparentWebMarkupContainer ch = new TransparentWebMarkupContainer( "childContent"); ch.setMarkupId("childContent"); ch.setOutputMarkupId(true); dialogDiv.add(ch); ch.add(form); this.sbt = new IndicatingAjaxButton("sbmtBtn", form) { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { form.success("asdasdas"); target.add(fpanel); } @Override protected void onError(AjaxRequestTarget target, Form<?> form) { form.error("error"); target.add(fpanel); } }; fpanel = new FeedbackPanel("feedback"); fpanel.setOutputMarkupId(true); form.add(fpanel); form.setDefaultButton(this.sbt); this.sbt.setMarkupId("sbmtBtn"); this.sbt.setOutputMarkupId(true); this.sbt.setDefaultFormProcessing(true); dialogDiv.add(this.sbt); // form.add(this.sbt); this.beforeOpen = new AbstractDefaultAjaxBehavior() { @Override protected void respond(AjaxRequestTarget target) { OnBeforeOpen(); target.add(form); } }; this.fpanel.add(this.beforeOpen); } public JsScope GetOpenDialogScope() { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("beforeOpenUrl", this.beforeOpen.getCallbackUrl()); parameters.put("dialogId", this.dialogDiv.getMarkupId()); return JsScope.quickScope("$.ajax({" + " async : false," + "url : '" + this.beforeOpen.getCallbackUrl() + "'}).done(function() {});" + "$('#" + this.dialogDiv.getMarkupId() + "').modal();" ); } protected void OnBeforeOpen() { } @Override public void renderHead(IHeaderResponse response) { super.renderHead(response); Bootstrap.renderHead(response); } } После отнаследовался от базового диалога : AddDepartment.java package com.nauhau.components; import org.apache.wicket.markup.html.form.RequiredTextField; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.spring.injection.annot.SpringBean; import com.nauhau.Models.DepartmentsModel; import com.nauhau.components.BaseDialog.BaseDialog; import com.nauhau.components.SchTree.SchTree; import com.nauhau.services.IDepartmentService; public class AddDepartmentDlg extends BaseDialog { /** * */ @SpringBean(name = "departmentService") private IDepartmentService depSrv; private TextField<String> name; private TextField<String> descr; private SchTree tree; private static final long serialVersionUID = 1L; public AddDepartmentDlg(String id) { super(id); this.name = new RequiredTextField<String>("depName"); this.name.setMarkupId("depName"); this.name.setOutputMarkupId(true); this.descr = new TextField<String>("depDescr"); this.descr.setMarkupId("depDescr"); this.descr.setOutputMarkupId(true); this.add(this.name); this.add(this.descr); } @Override protected void OnBeforeOpen() { this.name.modelChanged(); this.descr.modelChanged(); } } AddDepartment.Html <html xmlns:wicket=" http://wicket.apache.org"> <head></head> <body> <div> <wicket:extend> <div class="row"> <div class="span1 ">Name:</div> <div class="span5"> <input wicket:id="depName" type="text" /> </div> </div> <div class="row"> <div class="span1">Description:</div> <div class="span5"> <input wicket:id="depDescr" type="text" /> </div> </div> </div> </body> </html> Потом добавил диалог AddDepartmentDlg на одну из моих страниц. Перед поднятием диалога у меня дергается AbstractDefaultAjaxBehavior "beforeOpen" в котором я хочу очитсить все поля моей формы, но этого не происходит. Подскажите пожалуйста , какая правильная последовательность действий нужна для очистки полей формы , уже пробовал добавлять AbstractDefaultAjaxBehavior к разным компонентам базового диалога и к самому диалогу, пробовал вызывать setmodelChanged на элементах формы, ничего не помогает. Спасибо) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2013, 13:43:49 |
|
||
|
Wicket 6 ( очистка полей формы )
|
|||
|---|---|---|---|
|
#18+
Wicket - это stateful компонентный фрэймворк. Хранить состояние компонентов - это одно из его ключевых правил. А вы хотите заставить его работать как простой http.. )) В учебнике где-то даже картинка была, что внутри себя он хранит объекты-компоненты и когда их снова запрашивают, возвращает готовые. Лень искать сейчас... Поэтому единственный способ показать объект без предыдущего или более раннего состояния - это создать новый. Тут обсуждается: http://apache-wicket.1842946.n4.nabble.com/clearing-a-TextField-td1867189.html . Если правильно понял, это ваша проблема как раз.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2013, 09:55:13 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38461634&tid=2128221]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
198ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 460ms |

| 0 / 0 |
