I'm trying to make a directive that reads from two input sources and do some stuff to turn it into one. So to do that I'm listening to the changes of my two inputs and assigning the new combined value to the ngModel of my directive.
The problem is that I also need to know when the ngModel is modified outside the directive to do the reverse process and properly set the values of my two directive input sources. There is a proper way to do that?
I made a snippet to better illustrate the problem, this isn't my actual directive.
angular.module('myapp', [])
.controller('AppController', function($scope, $timeout) {
$scope.data = {
value: ''
};
$timeout(function() {
$scope.data.value = 'hellooooo';
}, 5000);
})
.directive('sampleDirective', function() {
return {
require: 'ngModel',
restrict: 'E',
template: '<input ng-model="data.input1" ng-change="changed()"><input ng-model="data.input2" ng-change="changed()">',
scope: {
ngModel: '='
},
controller: function($scope) {
$scope.data = {};
$scope.changed = function() {
$scope.ngModel = $scope.data.input1 + ' + ' + $scope.data.input2;
}
// The watch is running even when the ngModel is modified inside the changed function above
// I want it to only run when the model is changed from outside the directive, like
// I'm doing in the AppController.
$scope.$watch('ngModel', function(value) {
if (value) {
// Just simulating some processing
var length = value.length;
$scope.data.input1 = value.slice(0, length/2);
$scope.data.input2 = value.slice(length/2, length-1);
}
});
}
};
});
<div ng-app="myapp">
<div ng-controller="AppController">
<sample-directive ng-model="data.value"></sample-directive>
<br>
<br>
<div>{{ data.value }}</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.3/angular.js"></script>