如何在scope.watch中返回多个值?

时间:2015-11-13 14:22:10

标签: angularjs angularjs-watch

我试图从$ scope.watch函数返回多个值。

angular.module("MainApp")
.directive('isActiveNav', [ '$location', function($location) {
    return {
     restrict: 'A',
     link: function($scope, el, attrs) {
      $scope.location = $location;
      $scope.$watch(function() {
              return (el.parent().parent().parent().parent().hasClass('cbp-small'),location.path());
          }, function(hasClas, currentPath) {
              setTimeout(function(){
                console.log(hasClas, currentPath);
             },0)
        });
    }
 };
}]);

但是这给了我这个错误Uncaught SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode

我正在尝试在此处观看多个值:  1. APP的Current-Url  2.如果某个元素有一个名为" cbp-small"

的类

我已经尝试了$ watchCollection和$ watchGroup,但也无法使它们正常工作。因此我试图从scope.watch func返回多个值。

2 个答案:

答案 0 :(得分:2)

第一个参数不接受( )语法中的两个值。相反,您希望存储要监视的值并在对象或数组中返回。

angular.module("MainApp")
.directive('isActiveNav', [ '$location', function($location) {
    return {
     restrict: 'A',
     link: function($scope, el, attrs) {
      $scope.location = $location;
      $scope.$watch(
        function() {
          return {hasPath: el.parent().parent().parent().parent().hasClass('cbp-small'), currentPath: location.path()};
        }, 
        function(newPathObject, oldPathObject) {
          if (!angular.equals(newPathObject, oldPathObject)) {
            setTimeout(function(){               
              console.log(newPathObject.hasClass, newPathObject.currentPath);
            },0)
          };
        },
        true
      });
     }
   };
}]);

您还想添加true作为objectEquality == true的第三个参数。根据{{​​3}}:

  

当objectEquality == true时,watchExpression的不等式根据angular.equals函数确定。保存价值   对于稍后比较的对象,使用angular.copy函数。   因此,这意味着观看复杂的物体会产生不利影响   记忆和表现的影响。

此外,在使用$ watch时,您希望通过将对象包装在if语句中并使用angular.equals检查对象值是否已更改来阻止回调在对象实例化时触发。您可以使用Angular documentation

来引用它

答案 1 :(得分:0)

您可以连接值:

return el.parent().parent().parent().parent().hasClass('cbp-small').toString() + "&&&" + location.path();

那么将生成一个像"true&&&/.../.../"这样的字符串 Angular将脏检查此字符串,如果任何值将更改该字符串将更改,则将调用回调 并在回调写

function(newVal) {
     var args = newVal.split('&&&');
     var hasClas = args[0]==="true", currentPath = args[1];
     setTimeout(function(){
         console.log(hasClas, currentPath);
     },0
});