Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

connecting datetimepicker to angularjs

I need to create one input field with date and time using angular + bootstrap. I found this datetime picker it looks excatly i need - date and time in one field, and blocking user wrong editions. I writed a directive, datepickers started, but it changes the view and the model doesn't changes... I also tried onSelect, but nothing happens too

<div class="container container-fluid" ng-controller="Ctrl1">
2+2={{2+2}}, var1={{var1}}
    <form class="form-horizontal" novalidate name="form" ng-submit="submit()">
    <div class="well">
        <div id="date" class="input-append" datetimez ng_model="var1">
            <input data-format="MM/dd/yyyy HH:mm:ss PP" type="text" id="input1" name="input1" ng_model="var1"></input>
    <span class="add-on">
      <i data-time-icon="icon-time" data-date-icon="icon-calendar">
      </i>
    </span>
        </div>
    </div>
</form>

</div>

js

var project = angular.module('project',['ui.bootstrap']);

project.directive('datetimez', function() {
    return {
        restrict: 'A',
        require : 'ngModel',
        link: function(scope, element, attrs, ngModelCtrl) {
            $(function(){
                element.datetimepicker({
                    dateFormat:'dd/MM/yyyy hh:mm:ss',
                    language: 'pt-BR',
                    onSelect:function (date) {
                        //alert('zz');
                        ngModelCtrl.$setViewValue(date);
                        scope.$apply();
                    }
                });
            });
        }
    };
});

project.controller('Ctrl1', ['$scope', '$rootScope',  function(scope, rootScope){

    scope.var1="123";

}]);

How to fix it? to make connection?

like image 639
Sol Avatar asked Dec 08 '22 11:12

Sol


2 Answers

So, the problems are:

  1. change ng_modelper ng-model in the div id=date element;
  2. remove ng_model from the input element and implement ngModelCtrl.$render function in order to render model changes to the element
  3. as per the component docs:

The only event exposed is ‘changeDate’, which will expose ‘date’ and ‘localDate’ properties on the event object

So you need to handle the change event other ways, look:

element.datetimepicker({
  dateFormat:'dd/MM/yyyy hh:mm:ss',
    language: 'pt-BR'
  }).on('changeDate', function(e) {
    ngModelCtrl.$setViewValue(e.date);
    scope.$apply();
  });

Here is a working Plnkr.

Some additional tips:

  1. as said before, remove the internal ng-model and implement ngModelCtrl.$render to handle model changes
  2. use the template property in order to encapsulate the internal elements of the component

A pretty simple example of using $render:

var picker = element.data('datetimepicker');

ngModelCtrl.$render = function() {
  if (ngModelCtrl.$modelValue) {
    picker.setLocalDate(ngModelCtrl.$modelValue);
  } else {
    picker.setLocalDate(null);
  }
}
like image 79
Caio Cunha Avatar answered Jan 14 '23 03:01

Caio Cunha


Late answer, but you could always use this one

Bootstrap-ui/datetime-picker it uses the datepicker and timepicker from bootstrap-ui without using jquery or moment.js

like image 42
Gillardo Avatar answered Jan 14 '23 01:01

Gillardo