javascript - Angular `watch` 未按预期运行

标签 javascript angularjs

我有以下代码片段

function MyCtrl($scope, $log){

  $scope.name = 'guy';
  $scope.guy = {};


  function myWatch(){
    return function(newValue, oldValue){
      $log.info('these are the values',newValue, oldValue);

      if ( newValue === oldValue ){
        $log.info('they are the same');
      }
    }
  }

  $scope.$watch('guy',myWatch(), true);

  $scope.guy = { 'hello' : 'world' };

}

你可以run on plunkr - 寻找控制台打印!

想法是:

  • 为范围属性赋值guy
  • 设置$watch在那个属性(property)上
  • 将另一个值赋给guy
  • 期待newValueoldValue与众不同,看不见they are the same在控制台日志中打印 - 失败
    • 更具体地说,我希望 oldValue成为{} newValue 为 { 'hello':'world' }

我做错了什么,需要时我应该如何实现这个逻辑?

最佳答案

watch 没有额外的变化,因为 watch 是作为摘要周期的一部分进行评估的。我创建了一个更改函数中的 guy 的示例,通过单击按钮调用。

我还调整了您的 watch 函数,使其成为函数而不是返回函数的函数。

function myWatch(newValue, oldValue){
  $log.info('these are the values',newValue, oldValue);

  if ( newValue === oldValue ){
    $log.info('they are the same');
  }    
}

$scope.$watch('guy',myWatch, true);

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

关于javascript - Angular `watch` 未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26300411/

相关文章:

javascript - 过渡期不当行为

javascript - 如何在构建 html 标签时忽略 word 中未使用的空间,如 "Test - Text"

javascript - Bootstrap Carousel 不适用于 AngularJS

javascript - 如果将包含 Controller 代码的 javaScript 动态添加到 HTML dom,则 Controller 不会加载

javascript - AngularJS:如何将对象映射到 HTML 属性

javascript - 阿拉伯语 JavaScript 中的日期时间

javascript - 带有范围选择器的视频播放器可剪辑视频的该部分

javascript - 如何使用 JS 或 JQuery 检测 URL 是否有端口 ID?

angularjs - 如何从 jQuery 对话框按钮访问我的 Angular 范围?

angularjs - 在 AngularJS 中创建数据模板