I'm trying to write a directive which make use of isolated scope and ngModel directive.
Problem:
When the model is updated in the directive the value of the caller is not getting updated.
HTML:
<test-ng-model ng-model="model" name="myel"></test-ng-model> Directive:
app.directive( 'testNgModel', [ '$timeout', '$log', function ($timeout, $log) { function link($scope, $element, attrs, ctrl) { var counter1 = 0, counter2 = 0; ctrl.$render = function () { $element.find('.result').text(JSON.stringify(ctrl.$viewValue)) } $element.find('.one').click(function () { if ($scope.$$phase) return; $scope.$apply(function () { var form = angular.isObject(ctrl.$viewValue) ? ctrl.$viewValue : {}; form.counter1 = ++counter1; ctrl.$setViewValue(form); }); }); $element.find('.two').click(function () { if ($scope.$$phase) return; $scope.$apply(function () { var form = angular.isObject(ctrl.$viewValue) ? ctrl.$viewValue : {}; form.counter2 = ++counter2; ctrl.$setViewValue(form); }); }); $scope.$watch(attrs.ngModel, function (current, old) { ctrl.$render() }, true) } return { require: 'ngModel', restrict: 'E', link: link, //if isolated scope is not set it is working fine scope: true, template: '<div><input type="button" class="one" value="One"/><input type="button" class="two" value="Two"/><span class="result"></span></div>', replace: true }; }]); Demo: Fiddle
If the isolated scope is not set it works fine: fiddle
scope: truedoes not create an isolate scope, it creates a new child scope that prototypically inherits from the parent scope, hence the reason$parent.modelworks. (An isolate scope is created when we use thescope: { ... }syntax. Here, an new child scope is also created, but it does not prototypically inherit from the parent.) In general, a child scope should be used with ng-model since you are creating a component that needs to interact with other directives (i.e., ng-model). So I suggest you go with your second, working, fiddle.scope: true, but also use an object, not a primitive:<test-ng-model ng-model="someObj.model" ...>. fiddle.