Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to show model and view differently in AngularJS

I am implementing a functionality in AngularJS. When the user enters 1.5, In view, it should show as 01:30, but when I fetch this scope value in the controller it should return as 1.5. I have added code in plunker. Please find here.

Index.html:

<!DOCTYPE html>
<html ng-app="wbTimeConverter"> 

<head>
  <link rel="stylesheet" href="style.css">
  <script src="https://code.angularjs.org/1.5.8/angular.js"></script>
  <script src="script.js"></script>
  <script src="wbNumberToTime.js"></script>
</head>

<body ng-controller="AppController">
  <h1>Hello Plunker!</h1>
  <input type="text" md-maxlength="5" wb-number-to-time-convert ng-model="task" placeholder="task" ng-blur="onDataChange();" />

  <input type="text" md-maxlength="5" wb-number-to-time-convert ng-model="project" placeholder="project" ng-blur="onDataChange();" />

  <br>
  <label>Task : {{task}}</label><br>
  <label>Project : {{project}}</label><br>
  <label>TotalResult : {{totalHours}}</label>
</body>

</html>

Controller - Script.js

var app = angular.module('wbTimeConverter', []);

app.controller('AppController', function($scope) {
  $scope.onDataChange = onDataChange;

function onDataChange(){
  console.log("res");
  $scope.totalHours= parseFloat($scope.task) + parseFloat($scope.project, 10);
}


});

directive:

// 'use strict';
// /**
//  * This directive is convert number into hours and minutes format-HH:MM
//  * This will trigger when we change value in input element and gives respective value in time format
//  */

app.directive('wbNumberToTimeConvert', function ($filter, $browser) {
  return {
    require: 'ngModel',
    link: function ($scope, $element, $attrs, ngModelCtrl) {
      var listener = function () {
        var value = $element.val();
        var result = convertToTime(value);
        $element.val(result.timeFormat);
        $element.attr('attr-hrs', result.decimalFormat);
      };

      // This runs when we update the text field
      ngModelCtrl.$parsers.push(function (viewValue) {
        return viewValue;
      });

      $element.bind('change', listener);
      $element.bind('keydown', function (event) {
        var key = event.keyCode;
        // FIXME to handle validations
      });

      $element.bind('paste cut', function () {
        $browser.defer(listener);
      });

      function convertToTime(value) {
        var res = { 'timeFormat': '', 'decimalFormat': '' };
        var inputValue = value;
        if (inputValue.indexOf(':') > -1) {
          inputValue = convertToNumberFormat(inputValue);
          res.decimalFormat = inputValue;
        } else {
          res.decimalFormat = value;
        }

        inputValue = inputValue.split('.');
        var hoursValue = inputValue[0];
        if (inputValue.length > 1) {

          var hrs = parseInt(hoursValue, 10);
          hrs = isNaN(hoursValue) ? 0 : hrs;
          hrs = (hrs < 10) ? '0' + hrs : hrs;

          var minutesValue = inputValue[1];
          var mins = parseInt(minutesValue, 10);
          mins = (minutesValue.length < 2 && (mins < 10)) ? Math.round(mins * 6) : Math.round(mins * 0.6);
          mins = (mins < 10) ? ('0' + mins) : mins;
          inputValue = hrs + ':' + mins;
          res.timeFormat = inputValue;
        } else {

          inputValue = (parseInt(inputValue, 10) < 10) ? '0' + parseInt(inputValue, 10) : parseInt(inputValue, 10);
          inputValue = inputValue + ':' + '00';
          res.timeFormat = inputValue;
        }
        return res;
      }

      function convertToNumberFormat(inputValue) {
        var timeValue = inputValue.split(':');
        var hours = parseInt(timeValue[0], 10);
        var mins = parseInt(timeValue[1], 10);
        if (isNaN(hours)){
          hours = '00';
        }
        if (isNaN(mins)) {
          mins = '00';
        }
        mins = Math.round(mins / 0.6);
        if (mins < 10) {
          mins = '0' + mins;
        }
        var number = hours + '.' + mins;
        return number;
      }

    }

  };
});

Here is the plunker link: https://plnkr.co/edit/76lwlnQlGC0wfjixicCK?p=preview

On textbox blur, it is working fine of value differ in View and Controller on first time and from second time on blur in textbox, it is showing same value 01:30 in both view and controller. How can I resolve it?

like image 407
Ashok Gurram Avatar asked Oct 30 '22 15:10

Ashok Gurram


1 Answers

You can keep your input inside the ng-model myValue and call a function format(value) to display what you need

var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
  $scope.myValue = "1.5";
  $scope.format = function(value) {
    var hrs = parseInt(Number(value));
    var min = Math.round((Number(value) - hrs) * 60);
    return hrs + ':' + min;
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller="myCtrl">

  <input type="text" ng-model="myValue">
  <br>Formatted Value : {{format(myValue)}}
  <br>Base value : {{myValue}}
</div>
like image 109
Weedoze Avatar answered Nov 15 '22 10:11

Weedoze