Angular $ scope。$ watch on(for in ...)不起作用

时间:2013-08-21 17:15:38

标签: javascript angularjs

在我的代码中,我对以下某些变量中的监视更改进行了以下操作

$scope.$watch('ns.namespacea.watchable_value', function(newVal, oldVal){
    //...
})

$scope.$watch('ns.namespaceb.watchable_value', function(newVal, oldVal){
    //...
})

$scope.$watch('ns.namespacec.watchable_value', function(newVal, oldVal){
    //...
})

以前的代码工作正常,但我有很多namespaces watchable_value而且我想做

var namespaces = ['namespacea', 'namespaceb', 'namespacec'];

for (i = 0; i < namespaces.length; i++) {
    var namespace = 'ns.' + namespaces[i] + '.watchable_value';
    console.log(namespace) //prints 'ns.namespacea.watchable_value', 'ns.namespaceb.watchable_value, ..
    $scope.$watch(namespace, function(newVal, oldVal){
        //...
    })
}

但回调永远不会被称为

3 个答案:

答案 0 :(得分:0)

当您使用for ... in时,您获得的是密钥,而不是值:

for (var namespace in myNamespaces) {
    $scope.$watch('ns.' + myNamespaces[namespace] + '.watchable_value', function(newVal, oldVal){
        //...
    })
}

只需将数据索引回数组即可,你应该没问题。

答案 1 :(得分:0)

正如我所说,我猜这是一个回调问题,因为这很好用:

$scope.ns= {namespacea: {value: 'testa'},
            namespaceb: {value: 'testb'},
            namespacec: {value: 'testc'}
           };
for (i = 0; i < namespaces.length; i++) {
    var namespace = 'ns.' + namespaces[i] + '.value';
    console.log(namespace);
    $scope.$watch(namespace, function(newVal, oldVal){
        console.log(newVal);
    })
}

http://jsfiddle.net/xdsn8/

所以你只需要创建一个闭包来使回调知道命名空间,它就可以工作了。像这样:

http://jsfiddle.net/xdsn8/1/

答案 2 :(得分:0)

当我像commet @SebastienC一样封闭。工作正常

namespaces = ['minuta', 'menu', 'plato'];

callback = function(i) {
  var name = 'ns.' + i + '.value';
  return $scope.$watch(name, function(newVal, oldVal) {
    // ...
  });
};

for (_i = 0, _len = namespaces.length; _i < _len; _i++) {
  i = namespaces[_i];
  callback(i);
}