在我的代码中,我有以下内容来观察一些变量的变化
$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){
//...
})
}
但回调从未被称为
当您使用for ... in
时,您得到的是密钥,而不是值:
for (var namespace in myNamespaces) {
$scope.$watch('ns.' + myNamespaces[namespace] + '.watchable_value', function(newVal, oldVal){
//...
})
}
只要索引回到数组中,你就应该没事了。
正如我所说,我想这是一个回调问题,因为这很好:
$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/
当我像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);
}