AngularFire 0.5.0 更新后的另一个问题 - 计算返回 NaN
-
22-12-2019 - |
题
我对 angularFire 0.5.0 越来越失望,因为一切都不再正常工作了。在您的帮助下我能够修复单个项目的删除后,我遇到了另一个问题。
每件商品均包含日期、描述和价格。在更新之前,我能够计算所有价格的总和并将其返回到页面上。现在它只显示 NaN 或 Null。我已经试图找出原因,但计算中的两个值(earning.price、$scope.totalEarning)都是数字。我不明白。新的角火有什么作用吗?一段时间以来我一直在尝试修复它,但就是做不到。如果有人能弄清楚的话,我真的会的。可能我只是没有看到它,这是一个非常愚蠢的问题。
在 plunkr 上查看: http://embed.plnkr.co/jb1iWOcjcm0alFchmzOH/preview
这是代码:
$scope.addEarning = function() {
$scope.earnings.$add({date:$scope.FormEarningDate, description:$scope.FormEarningDescription, price:$scope.FormEarningPrice});
$scope.FormEarningDate = '';
$scope.FormEarningDescription = '';
$scope.FormEarningPrice = '';
$scope.updateEarning();
}
$scope.updateEarning = function() {
$scope.totalEarning = 0;
angular.forEach($scope.earnings, function (earning) {
price = parseFloat(earning.price)
$scope.totalEarning += price;
$log.log(typeof $scope.totalEarning);
})
$scope.totalBalance = $scope.totalEarning - $scope.totalCost;
}
和 HTML:
<form for="Profit" class="form-inline" style="margin-bottom: 20px" ng-submit="addEarning()">
<div class="form-group">
<div class="col-sm-3">
<input type="date" name="idate" ng-model="FormEarningDate" class="form-control" id="idate" placeholder="Date">
</div>
<div class="col-sm-5">
<input type="text" name="idesc" ng-model="FormEarningDescription" required class="form-control" id="idesc" placeholder="Description">
</div>
<div class="col-sm-2">
<input type="text" name="iprice" ng-model="FormEarningPrice" required class="form-control" id="iprice" placeholder="Amount">
</div>
</div>
<tr ng-repeat="earning in earnings | orderByPriority | orderBy : 'date'">
<td>{{earning.date}}</td>
<td>{{earning.description}}</td>
<td>{{earning.price}} €</td>
<td><button class="btn btn-danger" ng-click="earnings.$remove(earning.$id)">Löschen</button></td>
</tr>
<tr>
<td colspan="2"></td>
<td><strong>Total:</strong> {{totalEarning}} €</td>
<td></td>
</tr>
解决方案
更新答案
您有几件事做错了。正如我原来的答案中所述,您需要迭代 Firebase 中的键,而不是 Firebase 对象本身。此外,您需要确保所有更新都在 Firebase 更新后发生(通过 $on('change', ...)
事件处理程序)和 AngularJS 生命周期内(下面使用完成 $timeout
).
var app = angular.module('balance', ['firebase']);
app.controller('BalanceCtrl', function($scope, $log, $http, $timeout, $firebase) {
$scope.earnings = $firebase(new Firebase('https://dgdemo.firebaseio.com/Earnings'));
$scope.totalBalance = 'Nothing yet.';
$scope.totalEarning = 0;
$scope.totalCost = 0;
$scope.updateEarning = function() {
$scope.totalEarning = 0;
angular.forEach($scope.earnings.$getIndex(), function (id) {
var earning = $scope.earnings[id];
$scope.totalEarning += parseFloat(earning.price);
});
$scope.totalBalance = $scope.totalEarning - $scope.totalCost;
};
// Ensure any call to updateCallback will execute within the AngularJS lifecycle.
var updateCallback = angular.bind(null, $timeout, $scope.updateEarning);
$scope.addEarning = function() {
var earning = $scope.earnings.$add({
date: $scope.FormEarningDate,
description: $scope.FormEarningDescription,
price: $scope.FormEarningPrice
});
$scope.FormEarningDate = '';
$scope.FormEarningDescription = '';
$scope.FormEarningPrice = '';
};
$scope.earnings.$on('change', updateCallback);
});
原答案
这是因为 angular.forEach
正在迭代的所有属性 $scope.earnings
对象(这是一个 Firebase 对象)。您想要做的是迭代各个项目。
$scope.updateEarning = function() {
$scope.totalEarning = 0;
angular.forEach($scope.earnings.$getIndex(), function (id) {
var earning = $scope.earnings[id];
$scope.totalEarning += parseFloat(earning.price);
});
$scope.totalBalance = $scope.totalEarning - $scope.totalCost;
}
不隶属于 StackOverflow