【问题标题】:Angular: watch not working inside loopAngular:手表在循环内不工作
【发布时间】:2014-10-16 23:34:43
【问题描述】:

如果我动态注册手表事件(在我的情况下是 for 循环),手表将无法工作。请看一下小提琴。有什么想法吗?

var myApp = angular.module('myApp',[]);


function MyCtrl($scope, $parse) {

    // 1. binding watch inside loop (doesn't work):
    $scope.aaa = 1;
    $scope.bbb = 2;

    $scope.dependsOn = [
        function () { return $scope.aaa; },  
        function () { return $scope.bbb; }
    ];        

    for (var i = 0; i < $scope.dependsOn.length; i++) {        

        $scope.$watch(
            function () {
                return $scope.dependsOn[i];                    
            },
            function (newVal) {
                if (newVal !== undefined) {
                    console.log("doesn't work");
                }
            }
        );
    }    

    $scope.aaa = 5;
    $scope.bbb = 6;    

    // binding watch not inside loop (works):

    $scope.ccc = 1;
    $scope.ddd = 2;    

    $scope.dependsOn = [
        function () { return $scope.ccc; },
        function () { return $scope.ddd; }
    ];    

    $scope.$watch(
        function () {
            return $scope.dependsOn[0];                    
        },
        function (newVal) {
            if (newVal !== undefined) {
                console.log("works");
            }
        }
    );    

    $scope.$watch(
        function () {
            return $scope.dependsOn[1];                    
        },
        function (newVal) {
            if (newVal !== undefined) {
                console.log("works");
            }
        }
    );     

    $scope.ccc = 5;
    $scope.ddd = 6;      
}

fiddle

【问题讨论】:

    标签: angularjs for-loop watch


    【解决方案1】:

    您遇到的问题是因为您在闭包中捕获变量i。然后i 被增加到值 2 并退出循环,在实际执行委托时,您的每个委托将有 2 作为其 i 值。

    证明: http://jsfiddle.net/df6L0v8f/1/ (补充:)

    $scope.$watch(
         function () {
             console.log(i);
             return $scope.dependsOn[i];                    
         },
        function (newVal) {
             if (newVal !== undefined) {
                  console.log("doesn't work");
             }
        }
    );
    

    您可以通过使用自调用闭包在迭代时捕获值并为您的委托维护该值来解决此问题和变量提升问题。

    http://jsfiddle.net/df6L0v8f/4/

    for (var i = 0; i < $scope.dependsOn.length; i++) {        
         var watchDelegate = (function(itemDelegate){
              return function () {
                  return itemDelegate;                    
              };
          })($scope.dependsOn[i]);
    
          $scope.$watch(
              watchDelegate,
              function (newVal) {
                  if (newVal !== undefined) {
                      console.log(newVal());
                  }
              }
          );
      }
    

    【讨论】:

      猜你喜欢
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多