2017-03-17 32 views
0

我有一个带有几个输入字段和一个特殊字段的表单,我想用ajax进行处理。事情是,我想在单击AjaxLink之后仅处理该字段。没有处理整个表单。我想访问AjaxLink的onSubmit方法中的输入字段的值。那可能吗?如果是,那么如何?在Apache Wicket中使用ajax处理单个输入字段

问候, Mateusz来解决,这将是把那个“特殊的”场以其“特殊”链接到第二Form,然后用CSS来直观地定位“特别”领域像它

回答

1

默认情况下,AjaxLink确实提供而不是提交数据/表单。 AjaxSubmitLink和AjaxButton做到了!

对于您的用例,您可以使用AjaxRequestAttributes并发送“动态额外参数”。我在我的手机上,目前我不能给你一个例子,但想法是用一个键作为请求参数名称并赋值forn元素的值来构造一个简单的JSON对象。 Google这些关键字! 如果你无法做到这一点,然后添加评论,我会尽快更新我的答案!

这里是一个示例代码。当心我在这里完全写了它,所以它可能有一两个错字!

add(new AjaxLink("customSubmitLink") { 
    @Override public void onClick(AjaxRequestTarget target) { 
     int aFieldValue = getRequest().getRequestParameters().getParameterValue("aField").toInt(); 
     // do something with aFieldValue 
    } 

    @Override protected void updateAjaxAttributes(AjaxRequestAttributes attrs) { 
     super.updateAjaxAttributes(attrs); 
     attrs.getDynamicExtraParameters().add("return {\"aField\": jQuery('#aFormField').val()}); 
    } 
}); 
+0

嗨马丁, 我试过几个变种,但仍然无法使它的工作。你可以贴一些例子,它是如何做到的? –

+0

添加了一个示例。 –

+0

马丁,谢谢,谢谢,谢谢! :) 只需用jQuery替换$,它就像一个魅力。 –

0

的一种方式主要在Form之内。

事情是这样的:

Form<Void> mainForm = new Form<Void>("main-form") { 
    @Override 
    protected void onSubmit() { 
     super.onSubmit(); 
    } 
}; 
add(mainForm); 

// ... populate the main form 

Form<Void> secondForm = new Form<Void>("second-form"); 
add(secondForm); 
final Model<String> specialModel = Model.of(); 
secondForm.add(new TextField<>("special-field", specialModel)); 
secondForm.add(new AjaxButton("special-button") { 
    @Override 
    protected void onSubmit(AjaxRequestTarget target, Form<?> form) { 
     // ... process the special field value 
    } 
}); 

而在标记,像往常一样:

<form wicket:id="main-form"> 
    ... main form content 
</form> 

<form wicket:id="second-form"> 
    <label>Special field: <input class="special-field" wicket:id="special-field"></label> 

    <button wicket:id="special-button">Special button</button> 
</form> 

然后风格.special-fieldposition: absolute; top: ...或类似的东西。

该解决方案不是非常优雅,它更像是一种黑客攻击。这会给以后需要阅读的人造成一些困惑。但是如果可以使用CSS的技巧,它可能会起作用。

+0

不幸的是我已经有了一个表单,并且不能将该字段分隔成它自己的形式。 –

0

它实际上比rpuch建议的更容易。

只是窝表单,并确保只AjaxLink提交第二种形式:

  <form wicket:id="form"> 
      <div wicket:id="dateTimeField"></div> 
      <form wicket:id="secondForm"> 
       <input wicket:id="text" /> 
       <a wicket:id="secondSubmit">submit2</a> 
      </form> 
      <a wicket:id="submit">submit</a> 
      </form> 

    Form secondForm= new Form("secondForm"); 
    form.add(secondForm); 

    final IModel<String> textModel = Model.of(""); 

    TextField<String> text = new TextField<>("text", textModel); 
    secondForm.add(text); 

    AjaxSubmitLink secondSubmit = new AjaxSubmitLink("secondSubmit", secondForm) { 
     @Override 
     protected void onSubmit(AjaxRequestTarget target, Form<?> form) { 
      super.onSubmit(target, form); 
      logger.info("textMod: " + textModel.getObject()); 
     } 
    }; 
    secondForm.add(secondSubmit); 

第二种形式将呈现为一个div,但将有你想要的功能。但是当你提交外部表单时,第二种形式也会被提交。

相关问题