AngularJS 监听对象数组中的对象属性。
AngularJS 监听对象数组中的对象属性。
在我的控制器中有这个data
:\n
$scope.data = { home: { baseValue: "1", name: "home" }, contact: { baseValue: "2", name: "contract" } // 还有很多选项 };
\n还有一些类似这样的html代码:\n
{{item.name}} ....
\n现在,我想知道当baseValue
改变时,但由于我在data变量中使用了对象,所以不能简单地watch
属性。\n我尝试了这样的代码,但是我必须循环遍历整个数组:\n
$scope.$watch('data', function (newValue, oldValue, scope) { // 一些比较两个数组的代码,逐行比较 }, true);
\n我该如何简单地使用$watch
只知道baseValue
何时改变?\n类似的问题:\n
\n更新 1\n我可以为每个对象添加一个单独的监视器来知道何时更改baseValue
,但如果我有n
个对象,而不仅仅是像这个示例中的几个对象,那将不太好。\n
$scope.$watch('data.home', function (newValue, oldValue, scope) { // 使用newvalue.baseValue做一些操作 }, true); $scope.$watch('data.contact', function (newValue, oldValue, scope) { // 使用newvalue.baseValue做一些操作 }, true); ... //添加更多单独的`watch`
问题的出现原因:
问题的出现是因为使用AngularJS的ng-change指令只能监测到与绑定的输入交互时的数值变化,而无法监测到通过编程方式改变的数值。在这个问题中,希望能够在数组元素的baseValues发生变化时执行一些操作,而不管这些变化是通过绑定的输入还是通过编程方式进行的。
解决方法:
为了解决这个问题,可以使用AngularJS的$watch函数来监测对象属性的变化。具体的解决方法是使用一个循环遍历对象数组中的每个元素,然后使用$watch来监测每个元素的baseValue属性的变化。这样,无论这些变化是通过绑定的输入还是通过编程方式进行的,都能触发相应的操作。如果数组中的元素会动态添加和删除,还需要在移除元素时取消对应的$watch。
整理成一篇文章:
AngularJS中如何监测对象数组中的对象属性变化
在AngularJS中,我们可以使用ng-change指令来监测与绑定的输入交互时的数值变化。然而,有时我们希望能够监测到通过编程方式改变的数值,特别是在对象数组中的对象属性发生变化时。本文将介绍如何使用AngularJS的$watch函数来实现这个功能。
首先,让我们来看看一个简单的例子:
for(var key in $scope.data) { if($scope.data.hasOwnProperty(key)) { $scope.$watch("data['" + key + "'].baseValue", function(val, oldVal) { // 执行一些操作 }); } }
在这个例子中,我们使用一个循环遍历对象数组中的每个元素,并使用$watch来监测每个元素的baseValue属性的变化。这样,无论这些变化是通过绑定的输入还是通过编程方式进行的,都能触发相应的操作。
如果数组中的元素会动态添加和删除,我们还需要在移除元素时取消对应的$watch。可以使用$watch函数返回的注销函数来实现这一点,示例如下:
var w = $scope.$watch(...); // 监测元素的baseValue属性变化,并返回注销函数 ... w(); // 在移除元素时调用注销函数,取消$watch
需要注意的是,在监测对象属性变化时,我们需要正确地构造监测表达式。在这个例子中,我们使用了字符串拼接的方式构造监测表达式,如下所示:
$scope.$watch("data['" + key + "'].baseValue" .....);
然而,有时候字符串拼接可能会导致错误,特别是当键值中包含特殊字符时。为了避免这种情况,可以使用JSON.stringify函数来正确地构造监测表达式,示例如下:
$scope.$watch("data[" + JSON.stringify(key) + "].baseValue" .....);
通过使用AngularJS的$watch函数,我们可以监测对象数组中的对象属性变化。通过遍历对象数组,使用正确的监测表达式来构造$watch,我们可以在对象属性发生变化时执行相应的操作。如果数组中的元素会动态添加和删除,我们还需要在移除元素时取消对应的$watch。
AngularJS中的watch方法可以用来监视对象数组中的对象属性的变化。根据问题描述,可以使用ngChange来监视baseValue
的变化并触发相应的函数。
HTML部分:
Name: {{item.name}} BaseValue:
控制器部分:
$scope.baseValueChange = function(baseValue) { console.log("base value change", baseValue); }
如果需要更复杂的版本,可以获得旧值和新值,可以参考以下plunkr示例:http://plnkr.co/edit/hqWRG13gzT9H5hxmOIkO?p=preview
HTML部分:
Name: {{item.name}} BaseValue:
控制器部分:
$scope.baseValueChange = function(oldVal, newVal) { console.log("base value change", oldVal, newVal); }
这种方法对我来说有效,但是使用ng-change会对性能产生影响吗?这是因为函数不仅在值变化时执行,还会在其他情况下执行。因此,最好使用$watch来确保只有在数据更新时才执行函数。这种说法正确吗?
我认为与使用watch方法相比并没有太大区别。你可以比较一下使用ng-change和watch方法时注册的监听器数量,我认为是一样的。
我同意+Coyolero的观点。在我的情况下,提供的解决方案更适合问题。
我不认为这是一个好答案,因为它只会在输入控件的更新上触发,而不会在代码中触发。