Tapestry AjaxFormLoop
一个AjaxFormLoop控件需要指定source,value,t:id和encoder四个属性。
source和value跟loop一样。
而这个encoder必须要提供,因为它与addRow和removeRow有很大的关系。
另外一个form是必须的。
这里有几个注意事项
1 removeRow
对应着java端的onRemoveRowFromSomeId,而这个SomeId跟t:id的值是一样的。
2 addRow
同上,onAddRowFormSomeId。。。
3 onRemoveRowFromSomeId方法的参数,为value指定的类型。。。
而value的值为encoder的toValue的值。。。
4 onAddRowFormSomeId方法的返回值是一个value指定的类型。。。
所以页面上,必须要有这个value的所有的属性,否则会出错。。。
public class AjaxFormLoopStudy { @Inject private UserService userService; @Property @Persist private List<User> userList; @Property private User user; @SetupRender void preparePageBean() { userList = userService.getAllUsers(); } Object onAddRowFromUsers() { User user = new User(); return user; } void onRemoveRowFromUsers(User user) { System.out.println(user); userService.deleteCurrent(user); } // void onRemoveRowFromUsers(String user) // { // System.out.println(user); // // userService.deleteCurrent(user); // } public ValueEncoder<User> getValueEncoder() { return new ValueEncoder<User>() { public String toClient(User value) { return value.getId(); } public User toValue(String id) { return new User(id); } }; } }
<t:form t:id="form"> <t:ajaxformloop source="userList" value="user" t:id="users" encoder="valueEncoder"> <input t:type="textField" value="user.id" /> <input t:type="textField" value="user.name" /> <input t:type="textField" value="user.age" /> <input t:type="textField" value="user.story" /> | <t:removerowlink>删除</t:removerowlink> </t:ajaxformloop> </t:form>