【问题标题】:AngularJS $watch for value changes after initializationAngularJS $watch 初始化后的值变化
【发布时间】:2014-02-03 14:29:12
【问题描述】:

我有这种情况,我需要在模型更改时捕获事件,但我的指令中的初始化过早触发了事件。

Plunker:http://plnkr.co/edit/2T0Rq6yOXHWxQAOv8RpX?p=preview

我该如何克服这个问题?设置一些标志,但是如何/在哪里?其他方法?

谢谢!

更新

我在指令中添加了value 属性,以便您更好地理解我所说的初始化的意思。

Plunker:http://plnkr.co/edit/a5fzJi7VzAytj3Urj06L?p=preview

【问题讨论】:

  • 你能解释一下“太早”是什么意思
  • @DavinTryon 我的指令检查模型是否已定义。如果不是,它用“0”初始化模型。但是这种更改/初始化会触发控制器的 $watch ,我不希望这样做,因为它现在是用户的真正更改。

标签: javascript angularjs angularjs-directive


【解决方案1】:

我终于解决了!

Plunker:http://plnkr.co/edit/a5fzJi7VzAytj3Urj06L?p=preview

Angular 中的form 指令有一个名为$dirty 的属性。它以 false 开始,当您更改输入的值时,ngModel 指令使表单“脏”。首先我尝试在指令中使用ngModel,但最终我要求直接使用form

附言。这仅在第一次更改时触发,但这正是我所需要的。

【讨论】:

  • 您的初始示例中没有表单元素。
  • 我知道 :( 这是因为我试图尽可能地简化问题。
  • 很好,我也对这个问题感到困惑。感谢分享!
【解决方案2】:

您将data 定义为

$scope.data = { x: 51 }

稍后在解析过程中,Angular 检测到还有两个属性:yz,它们是未定义的。在这种情况下,您在指令中将它们设置为 0。所以你的数据对象变成了

{ x: 51, y: 0, z: 0 }

很明显$scope.data 已经改变并且观察者应该开火。这就是它发生的原因。

要解决这个问题,您可以简单地使用初始 yz 值定义 data

$scope.data = { x: 51, y: 0, z: 0 };

演示:http://plnkr.co/edit/RfztKvrxhzPYMoSss7Fm?p=preview

【讨论】:

  • 我明白它为什么会发生 :) 我只需要一种方法来克服这个问题,而无需在数据中设置初始值,因为我不知道应该在控制器中设置哪些属性。
  • 那么您还可以比较旧值和新值中数据属性的数量。 plnkr.co/edit/RfztKvrxhzPYMoSss7Fm?p=preview。如果此数字相同,您只想触发观察者,这意味着属性已更改但未添加(如果之前未定义)。
  • 谢谢!您的解决方案有效,但它不是有点 hacky 吗?如果我添加一个新值,它将不会被触发。 plnkr.co/edit/vTyrejMdrFh6Dty98USI?p=preview
  • 我同意这并不理想。尝试提出更好的方法。
【解决方案3】:

您可以检查对象上是否存在属性。 demo

 if ((newValue !== oldValue) && oldValue.x) {

或者更精确的demo:

if ((newValue !== oldValue) && (typeof oldValue.x !== 'undefined')) {

【讨论】:

  • 属性可能会改变,所以我无法检查。
  • 但是您检查属性是已定义还是未定义。在您的语句 data = {} 中,属性 x,y,z 最初是未定义的,然后将它们设置为 0 或它们定义的任何其他数字。
  • 您的解决方案要求我至少知道一个我不知道的属性。您还假设所有内容都在一个摘要周期中初始化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 2019-07-19
相关资源
最近更新 更多