Angularjs 如何监视多个变量?

Angularjs 如何监视多个变量?,angularjs,angularjs-scope,Angularjs,Angularjs Scope,我有两个$scope变量。它们被称为$scope.image和$scope.titleimage 基本上,存储相同类型的内容。我想现在跟踪其中一个更新的时间。但到目前为止,我还不知道如何在一个$scope.$watch()回调中跟踪两个变量 // How can I watch titleimage here as well? $scope.$watch('image', function(media) { console.log('Media change discoverd!');

我有两个
$scope
变量。它们被称为
$scope.image
$scope.titleimage

基本上,存储相同类型的内容。我想现在跟踪其中一个更新的时间。但到目前为止,我还不知道如何在一个
$scope.$watch()
回调中跟踪两个变量

// How can I watch titleimage here as well?
$scope.$watch('image', function(media) {
    console.log('Media change discoverd!');
}); 

$watch
方法接受函数作为第一个参数(字符串旁边)。
$watch
将“观察”函数的返回值,并在返回值更改时调用$watch侦听器

$scope.$watch(
职能(范围){
返回{image:scope.image,titleImage:scope.titleImage};
}, 
功能(图像、旧图像){
if(oldImages.image!==images.image){
console.log('Image changed');
}
if(oldImages.titleImage!==images.titleImage){
log('titleImage已更改');
}
}, 
真的
); 
此外,您可能会观察到一个连接的值,但这并不会让您知道观察到的值中有哪一个实际发生了更改:

$scope.$watch('image+titleImage',
函数(newVal、oldVal){
log(“其中一个图像已更改”);
}
); 
您还可以查看范围变量数组:

$scope.$watch(“[image,titleImage]”,
功能(图像、旧图像){
如果(旧图像[0]!==图像[0]){
console.log('Image changed');
}
如果(旧图像[1]!==旧图像[1]){
log('titleImage已更改');
}
},
真的
); 

斯图迪的建议会奏效。但是有一千种方法可以剥这只猫的皮。我认为,如果你在观察两个不同的值,那么为它们设置两个手表并在它们之间共享一个功能没有什么错:

函数式编程来营救! 使用函数创建函数非常棒

函数日志更改(expr){
返回函数(newVal、oldVal){
log(expr+'已从'+oldVal+'更改为'+newVal%);
};
}
$scope.$watch('image',logChange('image'));
$scope.$watch('titleImage',logChange('titleImage');

或您甚至可以将手表的设置包装在它自己的功能中(在我看来,这没那么令人兴奋): 。。但你说我有一千个

//assuming the second function above
angular.forEach(['image', 'titleimage', 'hockeypuck', 'kitchensink'], logChanges);

使用computed并返回要侦听的数组中的多个变量,这些变量应执行相同的函数

computed: {
  photo () {
    return [this.image, this.title]
  }
},
watch: {
  photo () {
    console.log('changed')
  }
},

这里找到了正确的答案:

对于数组,这意味着监视数组项;对于对象映射,这意味着监视属性

例如:

$scope.$watchCollection(function () {
    return {t : ctrl.time, d : ctrl.date};
}, function(value) {
    ctrl.updateDateTime();
});

您可以在您的作用域上创建一个具有这两个属性的新对象,然后查看父对象。例如
$scope.o={image:scope.image,titleImage:scope.titleImage}可能的重复---请查看dluz的答案,并查看如何通过
watchCollection
实现这一点的最后一个示例。实际上,我刚刚找到了更好的示例:
watchGroup
请看你的意思不是
oldImages.titleImages!==图像。标题图像
?(您有
oldImages
两次。)返回对象的第一种方法是最好的!clean和simpleI几乎没有看到第一个示例底部的小true参数。这使得新旧物体之间的比较成为一种深刻的比较。添加后工作正常:)@特洛伊木马我编辑过,但还没有反映…等待同行审查
$scope.$watchCollection(function () {
    return {t : ctrl.time, d : ctrl.date};
}, function(value) {
    ctrl.updateDateTime();
});