AngularJS:绑定一次属性

AngularJS: Binding once to an attribute

本文关键字:一次 属性 绑定 AngularJS      更新时间:2023-09-26

我试图将一个对象键/字段绑定到属性的值(data-oldField),这样,如果它的值通过用户输入(angular x-editable tables)更改,我可以通过data-newField获取html元素并获得data-oldField的值,这样我就可以重命名对象中的字段/键。我曾尝试使用本机::表达式绑定一次,但当提交对字段名称的更改时,data-oldField的值会发生变化,因此date-oldFielddata-newField的值随后相等,这正是我不希望的。

我还尝试使用angular-once库,并根据api添加指令once once-attr-field='field',但我得到了相同的结果。

<tr ng-repeat='(field, value) in user.data'>
  <td>
    <span editable-text='field' e-name='name' e-form='rowform' data-newField='{{ field }}' data-oldField='{{ ::field }}' e-required>
      {{ field }}
      </span>
  </td>
...
</tr>

编辑:

Plunker

我无法获得要在视图中显示的data-oldfielddata-newfield属性的值,但如果您使用浏览器的开发工具观察属性的值并按下"重命名字段"按钮,您可以看到即使我使用一次性绑定,data-oldfield的值也会发生变化。也许我误解了$watcher是如何处理这种绑定的?

从角度文档来看,使用::将对象更新为新值,但不会更新为查看:

An expression that starts with :: is considered a one-time expression. One-time expressions will stop recalculating once they are stable, which happens after the first digest if the expression result is a non-undefined value (see value stabilization algorithm below).

我不太确定我是否理解这个问题,但一种方法是在控制器中定义了一个函数,该函数将在ng-change上调用,可以执行您的逻辑。

另一种是$watch型号,但观看可能很昂贵

更新

我有点困惑你到底想实现什么,但这里有一个有ng变化的plunkr,你可以使用对象的副本引用$scope.user的新值和旧值。您也可以使用renameField函数,但是您希望