基于其他字段更新AngularJS字段

时间:2013-11-29 12:40:29

标签: angularjs

我有一系列输入字段都绑定到AngularJS模型上的属性,这些属性都是可编辑的。

根据其他用户输入,某些字段是可选的计算字段,可以找到我正在使用的输入类型的样本here

基本上,如果有人在timedistance中输入了一个值,那么它应自动计算speed,或speeddistance会计算时间,等等。

2 个答案:

答案 0 :(得分:5)

问题是未明确的,因为如果用户指定了所有三个值并且他更改了其中一个,该怎么办?我猜了一下,决定更改用户触摸的最后一个值,保持最近的两个值不变。

我认为它几乎适用于任何公式,但你的milage可能会有所不同。写作很有趣。 :)

以下是一个工作示例:http://jsbin.com/OsuMaSek/1/edit

$scope.time = 0;
$scope.distance = 0;
$scope.speed = 0;

$scope.touchOrder = {
  speed: 0,
  distance: 0,
  time: 0
};

function getLastTouched() {
  var minTouched = null, minVal = Infinity;
  Object.keys($scope.touchOrder).forEach(function (k) {
    if (minVal > $scope.touchOrder[k]) {
      minVal = $scope.touchOrder[k];
      minTouched = k;
    }
  });
  return minTouched;
}

$scope.totalTouchCount = 0;
$scope.touched = function (valTouched) {
  $scope.totalTouchCount++;

  $scope.touchOrder[valTouched] = $scope.totalTouchCount;

  if ($scope.totalTouchCount >= 2) {
    switch(getLastTouched()) {
      case 'time': $scope.time = $scope.distance / $scope.speed; break;
      case 'distance': $scope.distance = $scope.time * $scope.speed; break;
      case 'speed': $scope.speed = $scope.distance / $scope.time; break;
    }
  }
};

答案 1 :(得分:1)

您可以编写类似的内容(使用$watch):

JS

angular.module('app', [])
.controller('Ctrl', function ($scope) {

  $scope.mymodel = {};

  $scope.mymodel.time = 0;
  $scope.mymodel.distance = 0;
  $scope.mymodel.speed = 0;


   $scope.$watch(function () {
    return $scope.mymodel;
},
function (newValue, oldValue) {
    $scope.mymodel.speed = (newValue.distance > 0) ? newValue.distance / newValue.time : 0;
}, true);

});

<强> HTML

 Time: <input type="number" ng-model="mymodel.time" />
  <br />
  Distance: <input type="number" ng-model="mymodel.distance" />
  <br />
  Speed: <input type="number" ng-model="mymodel.speed" />

注释

它唯一的例子,在这种情况下你无法改变速度(速度)。

更改 DEMO

<强> [编辑]

您可以使用$watch 播放来控制子字段:

$scope.$watch(function () {
    return $scope.mymodel;
},
function (newValue, oldValue) { 

  if(newValue.speed != oldValue.speed){   
    $scope.mymodel.time = newValue.distance / newValue.speed;
    $scope.mymodel.distance =newValue.time *newValue.speed;
  }
  else if(newValue.distance != oldValue.distance){   
       $scope.mymodel.speed = (newValue.distance > 0) ? newValue.distance / newValue.time : 0;
  }
   else if(newValue.time != oldValue.time){   
      $scope.mymodel.speed = (newValue.distance > 0) ? newValue.distance / newValue.time : 0;
  }


}, true);

Demo 2