我刚刚开始使用AngularJS并尝试理解绑定技术。对于初学者,我试图制作一个简单的转换计算器(数十件,件数到几十件)。这很有效,但当我尝试将范围输入和数字输入绑定到同一模型属性时,数字输入不会更新调整范围值时。我有一个jsfiddle显示行为:
破解和工作小提琴的常见javascript:
var myApp = angular.module('myApp', []);
myApp.controller('CalcCtrl', function ($scope) {
var num = 0.0;
$scope.qty = new Quantity(12);
$scope.num = num;
});
function Quantity(numOfPcs) {
var qty = numOfPcs;
var dozens = numOfPcs / 12;
this.__defineGetter__("qty", function () {
return qty;
});
this.__defineSetter__("qty", function (val) {
qty = val;
dozens = val / 12;
});
this.__defineGetter__("dozens", function () {
return dozens;
});
this.__defineSetter__("dozens", function (val) {
dozens = val;
qty = val * 12;
});
}
HTML:
<div ng-controller="CalcCtrl">
<form>
<label for="pcs">Pieces:</label>
<input type="number" min="0" ng-model="qty.qty" size="20" id="pcs"
/>
<input type="range" min="0" max="100" ng-model="qty.qty" />
<br/>
<label for="numOfDozens">Dozens</label>
<input type="number" min="0" ng-model="qty.dozens" size="20"
id="numOfDozens" />
</form>
</div>
但是,将两个数字输入绑定到同一个模型属性似乎可以正常工作,如下所示:
HTML:
<div ng-controller="CalcCtrl">
<form>
<label for="pcs">Pieces:</label>
<input type="number" min="0" ng-model="qty.qty" size="20" id="pcs"
/>
<input type="number" min="0" max="100" ng-model="qty.qty" />
<br/>
<label for="numOfDozens">Dozens</label>
<input type="number" min="0" ng-model="qty.dozens" size="20"
id="numOfDozens" />
</form>
</div>
如何将范围和数字输入绑定到AngularJS中的单个模型属性?感谢。
答案 0 :(得分:17)
这里的问题是输入类型=“范围”适用于字符串而不适用于数字(而输入类型=“数字”仅适用于数字)。
http://www.w3.org/wiki/HTML/Elements/input/range
范围状态表示用于将元素的值设置为的控件 表示数字的字符串。
如果您在val = parseInt(val)
setter上添加qty
作为第一条指令,它应该有效:
this.__defineSetter__("qty", function (val) {
val = parseInt(val);
qty = val;
dozens = val / 12;
});
jsfiddle :http://jsfiddle.net/bmleite/2Pk3M/2/
答案 1 :(得分:7)
我认为这个解决方案更通用。
myApp.directive('input', function() {
return {
restrict: 'E',
require: '?ngModel',
link: function(scope, element, attrs, ngModel) {
if ('type' in attrs && attrs.type.toLowerCase() === 'range') {
ngModel.$parsers.push(parseFloat);
}
}
};
});
答案 2 :(得分:0)
您可以使用ng-model-options
解决此问题。我更改了jsfiddle,这是代码:
<强> HTML 强>:
<div ng-controller="CalcCtrl">
<form>
<label for="pcs">Pieces:</label>
<input type="number" min="0" ng-model="qty.qty" size="20" id="pcs" ng-model-options="{ getterSetter: true }"/>
<input type="range" min="0" max="100" ng-model="qty.qty" ng-model-options="{ getterSetter: true }"/>
<br/>
<label for="numOfDozens">Dozens</label>
<input type="number" min="0" ng-model="qty.dozens" size="20"
id="numOfDozens" ng-model-options="{ getterSetter: true }"/>
</form>
</div>
<强> JS 强>:
var myApp = angular.module('myApp', []);
myApp.controller('CalcCtrl', function ($scope) {
var num = 1.0;
$scope.qty = {
qty:function (val) {
return arguments.length ? (num = parseFloat(val)) : num;
},
dozens: function (val) {
return arguments.length ? (num = val*12) : num/12;
}
};
});