2012-11-13 23 views
1

对不起索引,如果这已被要求在其他地方,但我看了看周围所有弹簧模型属性列表元素,找到了一些答案,但没有一个完整的例子,我仍然在这一个疑问。获得使用从JavaScript

所以,我从我的春天控制器添加Autopopulating列表,我的jsp,我想我的JavaScript/jQuery函数里面的名单上添加项目。可能吗?

我尝试下面的代码来测试功能,但它没有工作(列表中的元素没有在生成的html都显示出来)。所以我不确定是否搞乱了javascrit/spring/jsp语法,或者只是不可能。

下面是代码:

控制器代码:

@RequestMapping(value="/create_custobject.html",method = RequestMethod.GET) 
public ModelAndView showCreateCustObjectPage() { 
    Map<String, Object> model = new HashMap<String, Object>(); 

    CreateObjectForm form = new CreateObjectForm(); 
    model.put("createObjectform", form); 

    return new ModelAndView("create_custobject", model) ; 

} 

形态代码:

public class CreateObjectForm { 

     private AutoPopulatingList<Criteria> ruleArray = new AutoPopulatingList<Criteria>(Criteria.class); 

    public AutoPopulatingList<Criteria> getRuleArray() { 
    return ruleArray; 
     } 

     public void setRuleArray(AutoPopulatingList<Criteria> ruleArray) { 
    this.ruleArray = ruleArray; 
     } 

     public CreateObjectForm() {} 
     } 

标准代码:

public class Criteria{ 

    String attribute; 

    String operator; 
     //... constructor + getters and setters 
} 

的javascript/jQuery代码(在与jsp相同的页面一个):

<script type="text/javascript"> 
$(document).ready(function(){ 
    //startup functionality 

 var i = 0; 
 document.getElementById("addCriteria").onclick = function() { 

     $("#msgid").html("${ruleArray[i].attribute}"); 

     ${ruleArray[i].attribute} = $('#attributeValue').val();    
     ${ruleArray[i].operator} = $('#operatorValue').val(); 

        i++;    

     } 
    } 
+0

递增我在你的onclick函数中没有任何意义。你的意图是什么? – Yevgeniy

回答

2

在您的形式使用JSTL现有的项目,如

<c:forEach items="${form.items}" var="item" varStatus="status" > 
<span class="count" > 
<form:input path="items[${status.index}].field" /> 

这将使这样

<form id = "idform" > 
<span class="count" > 
    <input name="items[0].field" id="items0.field" /> 
</span> 
</form> 

形式,那么你只需用JavaScript新形式的 “行” 与加相应指数

例如

var is = $('.count').size() 
$('#idform span:last').after('<span class="count" ><input name="items[' + is + '].field"' + is + '.field" /></span>') 

我认为,如果你使用spring 3 +,你不需要使用AutopopulatingList,任何集合都应该足够。

1

您的混合JSP EL和Javascript不正确。您不能在JSP表达式中使用var i,即。 ${ruleArray[i].operator}。我建议使用JSTL遍历列表并在脚本中创建属性。

在这一点上你的脚本可以设置只使用一个字符串表达式中的文字0。我假设你需要比这更强大的功能,你能更好地描述它吗?

$(document).ready(function(){ 
    document.getElementById("addCriteria").onclick = function() { 

    $("#msgid").html("${ruleArray[0].attribute}"); 

    //I assume you wanted to set the element to the value pulled from JSP EL 
    $('#attributeValue').val(${ruleArray[0].attribute});   
    $('#operatorValue').val(${ruleArray[0].operator});   

    } 
} 

使用JSTL的解决方案看起来是这样的:

<script> 
var criteria = []; 
<c:forEach var="criteria" items=${ruleArray}> 
    criteria.push({attr:${criteria.attribute}, oper: ${criteria.operator}); 
</c:forEach> 

for(var i = 0; i < criteria.length; i++){ 
    alert(criteria[i].attribute); 
} 
</script> 

该解决方案基本上使用JSTL编写JavaScript。这可能是一个更好的解决方案,可以修改控制器以返回JSON并仅在页面加载时进行Ajax调用。

在您正在引用在JSP代码 i以下行
+0

我清理了一下代码(添加一个“我”迭代),但基本上我想在javascript代码中的自动填充列表中添加新项目,并在完成后获取列表。我不能在javascript中使用jstl吗? – Thomas

+0

@Thomas:不,如果你希望你的代码在客户端执行,你不能。 – Yevgeniy

0

,但没有定义I:

$("#msgid").html("${ruleArray[i].attribute}"); 

在客户端上被执行,其限定i的JavaScript代码(即浏览器)。在呈现的html发送到客户端之前,jsp代码在服务器上执行。