【问题标题】:AngularJS $watch, wait variable declaration to triggerAngularJS $watch,等待变量声明触发
【发布时间】:2016-02-04 22:50:11
【问题描述】:

我有以下代码:

变量声明:

$scope.updateUploadView = 
{
  ready:{
    inview:false,
    text: "starting"
  },
  uploading:{
    inview:false,
    text: "uploading"
  },
  done:{
    inview:false,
    text: "done !"
  }
};

$手表:

angular.forEach($scope.updateUploadView, function(element, key) {
  $scope.$watch(function () {
    return element;
  }, function() {
   // do stuff
  });
},true);
});

这里的问题是我想忽略 $watch 以触发未定义的属性,因为它会导致视图在应用程序启动时更改 3 次。是否有可能等待变量声明?

http://jsfiddle.net/A8Vgk/2200/

【问题讨论】:

  • 把那一堆代码扔进 angular.element(document).ready(function(){ ... });
  • 已经试过了,还是触发3次:(
  • 关于您的控制器/父控制器/模板结构的信息太少。真的很难猜测可能会影响到这一点。但是你说它已经触发了3次。你能从中了解到点东西! 3个控制器? 3 次观看? 3个对象?沿着这些思路思考。不知道还有什么建议,在申请watcher之前找到一切准备就绪的点
  • 我链接了一个jsfiddle,你会更容易理解
  • 你可能简化了小提琴的例子,它似乎工作得很好

标签: javascript angularjs


【解决方案1】:

只需检查你的手表功能中的未定义。

$scope.$watch(function () {
  return element;
}, function(newValue, oldValue) {
  if(!angular.isDefined(newValue) && angular.isDefined(oldValue)) {
    // do stuff
  }
});

【讨论】:

  • 好吧,我确信它会起作用,但奇怪的是它进入了条件
  • 那么它们必须被定义。检查newValue和oldValue,它们是什么?
  • 我不使用它们(也许我使用的方法完全错误,我对 angular 还是很陌生)如果你想尝试,我会放一个指向 jsfiddle 的链接,这样会更容易你。
  • 它似乎工作正常,并且由于您的数据在您创建 $watch 之前就已经存在,您甚至不需要按照我的建议检查 undefined。它会为您创建的 3 个手表中的每一个触发一次 $watch。如果这不是您要查找的内容,请尝试使用 angular.equals() (请参阅更新的答案)
  • 实际上,这并没有像我预期的那样工作。在此处查看这篇文章以获取有关如何跳过初始 $watch stackoverflow.com/questions/16947771/… 的建议
猜你喜欢
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多