Two-way binding with range and number input in AngularJS

前端 未结 3 467
梦毁少年i
梦毁少年i 2021-02-07 06:39

I\'m just starting to play around with AngularJS and trying to understand the binding technique. For starters, I tried to make a simple conversion calculator (dozens to pieces,

相关标签:
3条回答
  • 2021-02-07 07:19

    I think this solution is more generic.

    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);
            }
        }
    };
    

    });

    full explanation

    0 讨论(0)
  • 2021-02-07 07:21

    The problem here is that the input type="range" works with Strings and not with Numbers (while input type="number" only works with Numbers).

    http://www.w3.org/wiki/HTML/Elements/input/range

    The range state represents a control for setting the element's value to a string representing a number.

    If you add val = parseInt(val) as your first instruction on the qty setter it should work:

    this.__defineSetter__("qty", function (val) {        
        val = parseInt(val);
        qty = val;
        dozens = val / 12;
    });
    

    jsfiddle: http://jsfiddle.net/bmleite/2Pk3M/2/

    0 讨论(0)
  • 2021-02-07 07:32

    You can solve it using ng-model-options. I changed jsfiddle and here is the code:

    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;
            }
         };
    });
    
    0 讨论(0)
提交回复
热议问题