【发布时间】:2016-08-26 15:15:20
【问题描述】:
我有一个应用程序,我经常需要从表单中的域对象的一对多关系中动态添加/删除字段组。这些字段可以是文本字段、选择、单选按钮等。我找不到任何简单的方法来做到这一点。
对于我来说,最好的解决方案是使用我的 grails 标记将 div 渲染到 javascript 字符串中,并在表单上添加删除 div。
例如点击添加
var vector = $.parseHTML('<div><label>Vector:</label><g:select from="${..}" /><g:text......');
$("#vectorDiv").append(vector);
但由于各种原因,这种方法不起作用。一个是 javascript 不允许字符串中的换行符(最后没有 / 我无法使用 grails 标签强制执行)。
我还不想开始使用 React。只是 jquery 和 grails 标签。
如果您愿意,我想就这种“设计模式”获得一些意见。 在我的 gsp 中渲染一个 div。
<!--templates-->
<div id="templates" hidden>
<div id="templateAccessoryVector" class="form-group accessoryVector">
<div class="col-sm-4">
<g:select class="form-control" name="accessoryVectorsTemplate.vectorId"
from="${Vector.getAccessoryVectors()}" optionKey="id" optionValue="alias" />
</div>
<label class="control-label col-sm-2">Percentage:</label>
<div class="col-sm-2 input-group">
<g:textField class="form-control text-right" name="accessoryVectorsTemplate.percentage" />
<span class="input-group-addon">%</span>
</div>
</div>
</div>
然后在javascript中
var templateAccessoryVectorDiv = $("#templateAccessoryVector").removeAttr('id');
function addAccessoryVector(){
var newAccessoryVectorDiv = templateAccessoryVectorDiv.clone();
$("[name^='accessoryVectorsTemplate']", newAccessoryVectorDiv).each (function(index, element) {
element.name = element.name.replace('accessoryVectorsTemplate', 'accessoryVectors[' + accessoryVectors + ']');
});
newAccessoryVectorDiv.appendTo($("#accessoryVectors"));
accessoryVectors++;
}
//add, remove functions
所有此类模板都可以存在于模板部分中,在需要时隐藏和使用。
【问题讨论】: