First things first, professional spelling is wrong in the first three inputs model's.
Now to answer your question, the problem with your approach is, you are using 4 different properties to store/refer 1 value i.e, the date. It is not pure angular way as far as I know.
You need to store it in only 1 property i.e, professional.start_date and then split the date month and year from the same until and unless you really have some thing to do separately with the date month and year. I hope I am clear. Please read below.
ngModelController gives us $formatters and $parsers, which format/parse your model/view and present them to the view or store them back to the model accordingly. You should use them actually. Implementation below.
Index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Index</title>
</head>
<body ng-app="myApp" ng-controller="AppController">
<div class="infoDateBox">
<input dd-directive type="text" placeholder="DD" ng-model="professional.start_date">
<input mm-directive type="text" placeholder="MM" ng-model="professional.start_date">
<input yyyy-directive type="text" placeholder="YYYY" ng-model="professional.start_date">
</div>
<span class="seperator">-</span>
<table>
<tr>
<td>Start date</td>
<td><input type="text" ng-model="professional.start_date"></td>
</tr>
</table>
<script src="angular.js" type="text/javascript "></script>
<script src="app.js" type="text/javascript "></script>
</body>
</html>
app.js
var myApp = angular.module('myApp', []);
myApp.controller('AppController', function($scope) {
$scope.professional = {};
$scope.professional.start_date = new Date();
});
myApp.directive('yyyyDirective', function($filter)
{
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attrs, ngModelController)
{
ngModelController.$formatters.push(function(data)
{
return $filter('date')(data, "yyyy");
});
ngModelController.$parsers.push(function(data)
{
var d = new Date(ngModelController.$modelValue);
d.setYear(data);
return d;
});
}
};
});
myApp.directive('mmDirective', function($filter)
{
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attrs, ngModelController)
{
ngModelController.$formatters.push(function(data)
{
return data.getMonth()+1;
});
ngModelController.$parsers.push(function(data)
{
console.log(data);
var d = new Date(ngModelController.$modelValue);
if(data.length!=0)
{
d.setMonth(parseInt(data)-1);
}
else
{
d.setMonth(0);
}
return d;
});
}
};
});
myApp.directive('ddDirective', function($filter)
{
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attrs, ngModelController)
{
ngModelController.$formatters.push(function(data)
{
return $filter('date')(data, "dd");
});
ngModelController.$parsers.push(function(data)
{
var d = new Date(ngModelController.$modelValue);
d.setDate(data);
return d;
});
}
};
});
This code can be optimized but I wrote it that way for understanding purpose. Let me know if you have any doubts. Documentation here