【问题标题】:AngularJS ngMessages can't bind to $index expressionAngularJS ngMessages 无法绑定到 $index 表达式
【发布时间】:2015-10-30 01:43:00
【问题描述】:

我正在构建一个 Angular 表单,它需要在 ngRepeat 内重复表单元素。

<form name="form">
    <div ng-repeat="x in [1,2,3,4]">
      <input name="something_{{$index}}" ng-model="hi" required>
      <div ng-messages="form.something_{{$index}}.$error">
        <ng-message="required">This is required</ng-message>
      </div>
    </div>
    <pre>{{form | json: 4}}</pre>
  </form>

Angular 现在支持动态声明 input 名称,因此您不必执行以下操作:

<div ng-repeat="x in [1,2,3,4] ng-form="repeated-form"></div>

您可以在ngRepeat 中使用{{$index}} 来动态声明项目。但这似乎不适用于ngMessages,当我尝试将索引绑定到其中时会引发错误。

即这个:

<div ng-messages="form.something_{{$index}}.$error">

抛出这个:

Error: [$parse:syntax] Syntax Error: Token '{' is an unexpected token at column 16 of the expression [form.something_{{$index}}.$error] starting at [{{$index}}.$error].

如果 ng-messages 无法查看使用其 {{$index}} 声明的表单值,我们如何动态声明要查看的表单属性?

PLNKR:http://plnkr.co/edit/4oOasbtffTgKqmxcppUG?p=preview(检查控制台)

【问题讨论】:

  • 你试过ng-messages="form.something_$index.$error" - 只需删除{{ }}
  • 感谢您的回复。那将是真棒!但它没有正确插值。最终结果html是&lt;div ng-messages="form.something_$index.$error"&gt;
  • 试试这个&lt;div ng-messages="form['something_'+$index].$error"&gt;
  • 感谢您的帮助!不幸的是,结果是一样的! :-( Syntax Error: Token '[' is not a valid identifier
  • ngBind({{ }} 指令)以与 ngMessages 相同的优先级执行。这意味着 ngMessages 可能会在元素的 ngBind 之前处理(因此 ngMessages 执行代码仍会看到未转换的 {{expr}} 文本。

标签: javascript angularjs forms


【解决方案1】:
    <div ng-repeat="x in [0,1,2,3]">
      <input name="something_{{$index}}" ng-model="hi" required>
      <div ng-messages="form['something_' + $index].$error">
        <ng-message="required">This is required</ng-message>
      </div>
    </div>

http://plnkr.co/edit/k5nzkpkJwSuf5dvlMMZi?p=preview

【讨论】:

  • 非常感谢,但插值不正确。随意在 Plnkr 中尝试。
  • 什么意思?在示例 plunkr 中一切正常
  • 添加了ng-maxlength,以便清楚它不起作用:plnkr.co/edit/4oOasbtffTgKqmxcppUG?p=preview。如您所见,$index 没有被插值
  • 感谢 Deblaton。我想我的印象是 $index 会被插入到 HTML 中并且我会看到索引号。当我查看它并看到 $index 时,我认为它不起作用。现在把我的头绕在它周围。非常感谢!
【解决方案2】:
ng-messages="form['something_' + $index].$error"

应该可以。我通常不会将 {{ }} 放在任何 ng 指令中,因为大多数 ng 指令以优先级 0 执行(包括 {{ }} 指令,ngBind)。此外,ng 指令都在其参数上使用 $evaluate,因此它们默认查看作用域中的变量值。

同一元素上的多个指令的优先级 0 意味着 Angular 无法保证首先应用哪个指令。因此,通常最好避免一起使用 ngDirective,因为行为可能会有所不同。 ngIf 是一个例外,因为它以 600 优先级执行(这就是为什么不针对当前不在 DOM 中的 ng-if 元素评估指令的原因)。

【讨论】:

猜你喜欢
  • 2017-04-04
  • 1970-01-01
  • 2012-07-03
  • 2016-10-25
  • 2017-10-19
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多