Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用对象相等的$watchGroup或深度监视组中的属性?_Javascript_Angularjs_Angularjs Scope - Fatal编程技术网

Javascript 如何使用对象相等的$watchGroup或深度监视组中的属性?

Javascript 如何使用对象相等的$watchGroup或深度监视组中的属性?,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,我想要一个指令,每当三个作用域变量发生变化时重新呈现HTML。前两个只是整数,第三个是数组 我们有$watchGroup来监视多个变量,我们有$watch和objectEquality作为第三个参数,我们有$watchCollection类似于$watch,但隐含了objectEquality 有没有一种方法可以写一块类似这样的美元手表 $scope.$watchGroup(['number1', 'number2', 'myArray'], callback, true); // true f

我想要一个指令,每当三个作用域变量发生变化时重新呈现HTML。前两个只是整数,第三个是数组

我们有
$watchGroup
来监视多个变量,我们有
$watch
objectEquality
作为第三个参数,我们有
$watchCollection
类似于
$watch
,但隐含了
objectEquality

有没有一种方法可以写一块类似这样的美元手表

$scope.$watchGroup(['number1', 'number2', 'myArray'], callback, true); // true for objectEquality

看来watchGroup不支持深度手表。因此,您可能可以通过注册一个匿名的deepwatcher,使用watch函数传入的值数组来进行黑客攻击

$scope.$watch(function(){
     return ['number1','number2','myArray'].map(angular.bind($scope, $scope.$eval));
  }, function(newV){
      console.log(newV);
  },true);

或者只需将此函数作为实用程序函数添加到rootScope上,并从任何继承的作用域访问它

.run(function($rootScope){
  $rootScope.deepWatchGroup = function(exp, callback){
    if(!angular.isArray(exp) || !thisScope.$watch) return; //Or log some error if array is not passed in or the context is not really a scope object

   var thisScope = this, //get scope
        evalFunc = angular.bind(thisScope, thisScope.$eval); //and a bound eval func

     thisScope.$watch(function(){
        return exp.map(evalFunc); //return array of evaluated values
     }, callback,true);
   }
});
从控制器执行以下操作:

$scope.deepWatchGroup(['number1','number2','myArray'],function(newV){
  console.log(newV);
});

如果您想查看字符串表达式数组(即,您不需要查看函数,
$watchGroup
和PSL的解决方案都可以处理这些函数),这里有一个替代方案:

$scope.$watch('[number1, number2, myArray]', callback, true);
如果您想为类似于PSL的功能创建一个实用函数:

.run(function($rootScope){
  $rootScope.deepWatchGroup = function(watchExpressions, listener){
    this.$watch('[' + watchExpressions + ']', listener, true);
  }
});

我也有和你一样的问题

我对这个深层次观察组问题的解决方案是:

// Create new object to watch different types of objects
var objectToBeWatch = {
    number1: number1, 
    number2: number2,
    myArray: myArray
};

$scope.$watch(
    function () {
        return objectToBeWatch;
}, callback, true);

我希望这有帮助

我在AngularJS 1.3.6上使用AngularJS 1.3,我必须将
这个范围
换成
这个
,然后使用
$scope.deepWatchGroup.call($scope,['one','two'],function(newVals){})
。谢谢你的快速提示!你能提供一个例子,说明你是如何让它工作的Morgan Delaney吗?还有关于Angular的最新版本的帮助吗。1.4.x?您认为此解决方案是否有效?watch表达式将在每个摘要上运行。执行
map
+
$eval
似乎是一项繁重的任务,因为它被多次调用。@AlejandroIglesias这是一个非常古老的答案,但你是对的:),首先,如果你需要手动添加一块手表,那么主要问题就在于-更好的设计,更具反应性的面向组件的设计,将首先避免创建手动观察者。我认为这应该是优化的重点。对不同类型的变量都能完美地工作。