如何修复 Struts 2 <s:checkbox> 标记中的 Angular 语法分析器错误?

How to fix the Angular syntax parser error within a Struts 2 <s:checkbox> tag?

我在使用 AngularJS + Struts 2.

时遇到了一个奇怪的错误

我有一个 Java 对象 form,其 boolean 属性名为 paid

当我写的时候:

<div class="col-sm-10 form-checkbox">
    <s:checkbox name="xxxxx" ng-model="model" 
        ng-init="model = <s:property value = '%{form.paid}' />" 
        theme="simple" />
</div>

我收到 FireBug 抱怨 AngularJS 语法解析器错误,这将我引导至此页面:

syntax error page

提示表达式错误。

如果我写:

<div class="col-sm-10 form-checkbox">
    <s:checkbox name="xxxxx" ng-model="model" 
        ng-init="%{form.paid}" 
        theme="simple" />
</div>

没有报错。我猜这是因为 Struts 标签以 < 开头,这在 Angular.

中不受欢迎

但是,这一行没有报错:

<select ng-model="estadoId" 
        ng-init="estadoId=<s:property value='%{form.estadoId}'/>"
        name="form.estadoId" id="form.estadoId" 
        value="<s:property value='%{form.estadoId}' />"    >

所以,AngularJS 在 Struts 2 中抱怨 <>?或者,我也不允许在另一个 <s:...> 中使用 <s:...>?如果是后者,为什么编译 Angular 而不是 Struts 2??

在第一个片段中,您嵌套了 Struts 标签,这是一个 语法错误:

<s:checkbox name="xxxxx" 
        ng-model="model" 
         ng-init="model = <s:property value = '%{form.paid}' />" 
           theme="simple" />

在第二个中,您对 OGNL 的处理是正确的,但是您省略了 model = 部分:

<s:checkbox name="xxxxx" 
        ng-model="model" 
         ng-init="%{form.paid}" 
           theme="simple" />

正确的版本是两者的混合:

<s:checkbox name="xxxxx" 
        ng-model="model" 
         ng-init="model = %{form.paid}" 
           theme="simple" />

否则您可以使用原始 HTML 标签(如在您的 <select> 示例中,这是标准 HTML 标签而不是 <s:select>,因此没有标签正在嵌套):

<input type="check" name="xxxxx" 
        ng-model="model" 
         ng-init="model = %{form.paid}" />

注意:在这种情况下,您应该在每个复选框下创建一个隐藏参数来模拟 <s:checkbox> 标签行为并使 Checkbox Interceptor 满意。