gpt4 book ai didi

javascript - Angular $watch 不工作

转载 作者:数据小太阳 更新时间:2023-10-29 06:01:06 27 4
gpt4 key购买 nike

我在我的 Controller 上使用了两个 $watches 来观察这两个对象:

$scope.gastos = {
name: "Gastos mensuales",
data: [0,0,0,0,0,0,0,0,0,0,0,0],
labels: ["Enero", "Febrero", "Marzo", "Abril", "Mayo",
"Junio", "Julio", "Agosto", "Septiembre", "Octubre",
"Noviembre", "Diciembre"]
};

$scope.ganancias = {
name: "Ganancias mensuales",
data: [0,0,0,0,0,0,0,0,0,0,0,0],
labels: ["Enero", "Febrero", "Marzo", "Abril", "Mayo",
"Junio", "Julio", "Agosto", "Septiembre", "Octubre",
"Noviembre", "Diciembre"]
};

两个图表(来自 Charts.js 和 angular-charts 插件)从中读取数据。我已将图表放在从属性接收数据的自定义指令中,并且它们工作正常。

问题是,我想创建另一个图表,它读取另一个与这些对象相等的对象,但在这个方法中计算它的数据:

function calcularBeneficios(){
var data = [];
for(var i=0;i<12;i++){
data[i] = $scope.ganancias.data[i] - $scope.gastos.data[i];
}
console.log("FUNCTION DATA: "+data);
return data;
}

这些是监视(我尝试同时监视 objectobject.data 变量):

$scope.$watch("gastos", function(){
$scope.beneficios.data = calcularBeneficios();
console.log("SCOPE: "+$scope.beneficios.data);
});

$scope.$watch("ganancias", function(){
$scope.beneficios.data = calcularBeneficios();
console.log("SCOPE: "+$scope.beneficios.data);
});

这行不通。您看到所有的 console.logs 了吗?我只看到一次 "SCOPE"console.log(对于 ganancias 甚至没有两次)。当我更改绑定(bind)到这两个对象的某些输入中的数据时,一切正常(图表得到实时更新)但 beneficios 图表没有,而且这些 watch 也不起作用.

我是不是在这两 block watch 上做错了什么?

最佳答案

问题是您正在查看顶级 gastosganancias 对象。这有两个潜在的问题:

  1. 作为docs for $watch也就是说,默认情况下,普通的 JavaScript 不等式用于确定对象是否已更改 (x !== y)。由于对象本身是同一个对象,您只是在 中更改数据,这将始终为真,因此不会触发 $watch

  2. 您可以绕过 1. 通过将 objectEquality 标志设置为 true ($scope.$watch('x', function(){}, true))。然后进行深入比较,应该找出 data 数组中的差异。然而,这对性能的要求更高。

因为您只是在每个对象中使用data 数组,所以您可以简单地使用$scope.$watchCollection。在 gastos.data 上。这更干净、更快。

这是一个演示这一点的工作片段:

angular.module("myApp", []).controller('myCtrl', function($scope) {

// same code
function calcularBeneficios() {
var data = [];
for (var i = 0; i < 12; i++) {
data[i] = $scope.ganancias.data[i] - $scope.gastos.data[i];
}
console.log("FUNCTION DATA: " + data);
return data;
}


$scope.beneficios = {
name: "Beneficios mensuales",
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
labels: ["Enero", "Febrero", "Marzo", "Abril", "Mayo",
"Junio", "Julio", "Agosto", "Septiembre", "Octubre",
"Noviembre", "Diciembre"
]
};

$scope.gastos = {
name: "Gastos mensuales",
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
labels: ["Enero", "Febrero", "Marzo", "Abril", "Mayo",
"Junio", "Julio", "Agosto", "Septiembre", "Octubre",
"Noviembre", "Diciembre"
]
};

$scope.ganancias = {
name: "Ganancias mensuales",
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
labels: ["Enero", "Febrero", "Marzo", "Abril", "Mayo",
"Junio", "Julio", "Agosto", "Septiembre", "Octubre",
"Noviembre", "Diciembre"
]
};

// watch the array collection in gastos.data
$scope.$watchCollection("gastos.data", function() {
$scope.beneficios.data = calcularBeneficios();
console.log("SCOPE: " + $scope.beneficios.data);
});

// watch the array collection in ganancias.data
$scope.$watchCollection("ganancias.data", function() {
$scope.beneficios.data = calcularBeneficios();
console.log("SCOPE: " + $scope.beneficios.data);
});


// testing functions

$scope.changeGastos = function() {
$scope.gastos.data[4] = 10;
}

$scope.changeGanancias = function() {
$scope.ganancias.data[0] = 40;
}
})
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js"></script>

<div ng-app="myApp" ng-controller="myCtrl">
<h3>beneficios.data</h3>
<ul>
<li ng-repeat="i in beneficios.data track by $index">{{i}}</li>
</ul>
<button ng-click="changeGastos()">Change Gastos</button>
<button ng-click="changeGanancias()">Change Ganancias</button>
</div>

关于javascript - Angular $watch 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35623362/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com