【问题标题】:AngularJS - Multiple binding - calculating input valuesAngularJS - 多重绑定 - 计算输入值
【发布时间】:2014-10-27 10:24:33
【问题描述】:

我正在使用 AngularJS 构建一个大型表单,它将用大量公式和函数替换一个巨大的 excel 电子表格。简而言之,这种形式是一个计算器 - 其中很多值取决于以前的值。我目前的方法是在影响下一个输入的所有输入上添加 ng-change - 还将观察者添加到那些以编程方式更改的字段。我发现这种做法非常混乱且难以维护。做这种工作有更好的模式吗?

我正在构建的完整表单包含 60 多个相互交互的字段。所有计算值,例如示例中的“价格”,都可以手动更改或覆盖。因此,无论价格是通过以前的值计算还是手动更改,下面示例中“总价”的计算都应该是自动的。

小例子:

<div ng-app>
  <h2>Calculator</h2>

  <div ng-controller="TestCtrl">
    <form>
        <li>Width (cm): <input type="text" ng-change="changePrice()" ng-model="width"/> </li>
        <li>Height (cm): <input type="text" ng-change="changePrice()" ng-model="height"/> </li>
        <li>Depth (cm)<input type="text" ng-change="changePrice()" ng-model="depth"/>  </li>   
        <li>Price per cm3<input type="text" ng-change="changePrice()" ng-model="priceCm"/>  </li>
        <li><b>Price</b><input type="text" ng-model="price"/>  <br/><br/></li>
        <li>Packaging price<input type="text" ng-change="changeTotalPrice()" ng-model="packagePrice"/>  </li>
        <li><b>Total price</b><input type="text" ng-model="total"/>  </li>
    </form>
  </div>
</div>

JS:

function TestCtrl($scope) {
   $scope.$watch('price', function(newValue,oldValue){
    if(newValue != oldValue)
    {
        $scope.changeTotalPrice();
    }
});

$scope.changePrice = function(){
    var width = 0;
    var height = 0;
    var depth = 0;
    var priceCm = 0;

    width = $scope.width;
    height = $scope.height;
    depth = $scope.depth;
    priceCm = $scope.priceCm;

    if(width > 0 && height > 0 && depth > 0 && priceCm > 0)
    {
        $scope.price = width * height * depth * priceCm;
    }          
}

$scope.changeTotalPrice = function(){
    var price = 0;
    var packaging = 0;

    price = $scope.price;
    packaging = $scope.packagePrice;

    if(price > 0 && packaging > 0)
    {
        $scope.total = price*1 + packaging*1;
    }          
  }
}

示例:http://jsfiddle.net/rewnao6p/3/

【问题讨论】:

  • 不要只链接到小提琴。当您尝试仅使用小提琴链接提交答案时收到的警告在这方面应该已经足够清楚了。请发布您的代码的小示例来重现该问题。
  • @Cerbrus 谢谢,我修好了。

标签: javascript html angularjs angular-ngmodel


【解决方案1】:

是的,这是一种更好的方法:由于您的总数取决于其余值,因此动态计算总数

function TestCtrl($scope) {

 $scope.price = function(){
    var width = $scope.width;
    var height = $scope.height;
    var depth = $scope.depth;
    var priceCm = $scope.priceCm;

    if(width > 0 && height > 0 && depth > 0 && priceCm > 0)
    {
        return width * height * depth * priceCm;
    }          
}

 $scope.totalPrice = function(){        
    var price = $scope.price();
    var packaging = $scope.packagePrice;

    if(price > 0 && packaging > 0)
    {
        return price*1 + packaging*1;
    }          
 }

}

见小提琴:http://jsfiddle.net/g7p7ho6z/

【讨论】:

  • 我尝试过这种方式,但是我无法手动更改/覆盖价格并且计算不会继续。
  • 那是另一个问题,如果您在问题中详细说明,我们或许可以为您提供帮助。这是当前问题的答案
猜你喜欢
  • 2021-01-19
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 2018-05-27
  • 2015-12-01
相关资源
最近更新 更多