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();
});