我有一系列输入字段都绑定到AngularJS模型上的属性,这些属性都是可编辑的。
根据其他用户输入,某些字段是可选的计算字段,可以找到我正在使用的输入类型的样本here。
基本上,如果有人在time
和distance
中输入了一个值,那么它应自动计算speed
,或speed
和distance
会计算时间,等等。
答案 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);