0

我正在尝试从 $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 函数中返回多个值。

4

2 回答 2

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 添加第三个参数。根据Angular 文档

当 objectEquality == true 时,watchExpression 的不等式由 angular.equals 函数确定。为了保存对象的值以供以后比较,使用了 angular.copy 函数。因此,这意味着观看复杂的对象将对内存和性能产生不利影响。

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

于 2015-11-13T14:39:27.703 回答
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
});
于 2015-11-13T14:36:25.607 回答