当然,我的第一个Grails项目会出现我的数据模型和UI设计者想要的演示文稿之间的疯狂不匹配。
以下是问题空间的简化说明:
杂货店有三种成分:胡萝卜,芹菜和西红柿。该应用程序的目的是保存用户的购物清单:每个购买的数量。
网页设计师希望通过多个HTML SELECT实现此目的,因此您可以从下拉列表中选择要购买的成分,然后在其旁边键入数量。如果您想要更多成分,请单击添加更多SELECT的JavaScript链接。
设计指定每个下拉列表都相同,并且行数不受限制。所以你可以得到一个有5行的表格,相当于3个胡萝卜,9个芹菜,2个芹菜,5个胡萝卜和1个番茄。
我应该“生产”的是8个胡萝卜,11个芹菜和一个番茄的订单。
没有涉及到为什么这是糟糕的UI设计的所有争论,我想实际上理解如何将模型/控制器映射到给定这种不匹配的视图,既提交又最终编辑存储的提交
我最初的想法是:
但是,当我阅读有关Command对象的内容时,我想知道这是否是一种更好的方法。
我在线阅读了很多页面,但没有看到任何针对此类MVC不匹配的解决方案。
撇开明显的答案(与设计师作斗争),处理此问题的“Grails”方式是什么?
答案 0 :(得分:0)
我认为你最初的想法应该有效。命令对象可以很好地将构建域对象的逻辑移出控制器方法,但不需要。如果您向shoppingList(名称,日期等)添加更多信息,则可以更容易阅读代码,并且可以更轻松地进行验证。但是没有cmd对象的东西应该可行,我觉得不会错...
GSP:
<g:form .......>
<div><g:select name="ingredient" from="${['Carrots','Celery','Tomato']}"><g:textField name="amount"/></div>
<div><g:select name="ingredient" from="${['Carrots','Celery','Tomato']}"><g:textField name="amount"/></div>
<div><g:select name="ingredient" from="${['Carrots','Celery','Tomato']}"><g:textField name="amount"/></div>
<div><g:select name="ingredient" from="${['Carrots','Celery','Tomato']}"><g:textField name="amount"/></div>
</g:form>
控制器:
def saveCart = {
def shoppingList = [:]
def ingredients = params.list('ingredient')
def amounts = params.list('amount')
ingredients.eachWithIndex() { obj, i ->
if (shoppingList.containsKey(obj)) {
shoppingList[obj] = shoppingList[obj] + amounts[i]
} else {
shoppingList[obj] = amt[i]
}
}
// shoppingListshould have everything you need now
....
....
}