AngularJS:将属性绑定一次

时间:2015-11-29 12:55:07

标签: javascript angularjs data-binding

我试图将对象键/字段绑定到属性值data-oldField),这样如果它的值通过用户输入(angular x-editable tables)更改,我可以通过以下方式获取html元素data-newField并获取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属性的值,但如果您使用浏览器的开发工具观察属性的值并按&#34;重命名字段&#34;按钮,即使我使用一次性绑定,您也可以看到data-oldfield的值发生了变化。也许我误解了观察者如何为这种约束工作?

1 个答案:

答案 0 :(得分:0)

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

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模型,但观看可能很昂贵

更新

我有点困惑你到底想要完成什么,但这里有一个plunkr,它有一个ng-change,你可以在那里引用新值和{{1的旧值使用对象的副本。您也可以使用$scope.user功能