Angularjs Custom Directive Two Way Binding
Solution 1:
Why is an isolate scope overkill? its pretty useful for exactly this kind of thing:
scope: {
"twoway": "="// two way binding
},
This is a pretty idiomatic angular solution to this problem, so this is what I'd stick with.
Solution 2:
I'm surprised no one has mentioned ng-model
, the default directive for doing two-data binding. Maybe it's not so well known, but the linking function has a fourth parameter:
angular.module('directive-binding', [])
.directive('twoway',
function() {
return {
require: '?ngModel',
link: function(scope, elem, attrs, ngModel) {
elem.on('click', function() {
var counter = ngModel.$viewValue ? ngModel.$viewValue : 0
ngModel.$setViewValue(++counter);
scope.$apply();
});
}
};
}
);
On your view
<buttontwowayng-model="counter">Click Me</button><p>Click Count: {{ counter }}</p>
The fourth parameter is an API for the ngModelController, which has many uses for handling (parsing and formatting, for instance) and sharing data between a directive and a scope.
Here's the updated Plunker.
Solution 3:
You can definitely simplify it a bit like this without using $parse
angular.module('directive-binding', []).directive('twoway', [function () {
return {
scope: false,
link: function (scope, elem, attrs) {
elem.on('click', function () {
scope[attrs.twoway] = scope[attrs.twoway] == null ? 1 : scope[attrs.twoway] + 1;
scope.$apply();
});
}
};
}]);
Solution 4:
A great way to apply two way binding is to use directive components. Here is my solution. It allows use of ng-repeat and expandable data binding.
HTML
<bodyng-controller='MainCtrl'>
Data: {{data}}
<hr><mydirectivename='data[0]'></mydirective><hr><mydirectivename='data[1]'></mydirective></body>
Controller
app.controller('MainCtrl', function($scope) {
$scope.data = [];
$scope.data[0] = 'Marco';
$scope.data[1] = 'Billy';
});
Directive
app.directive("mydirective", function(){
return {
restrict: "EA",
scope: {name: '='},
template: "<div>Your name is : {{name}}</div>"+
"Change your name : <input type='text' ng-model='name' />"
};
});
In the case of the counter, it can be done using the same method.
Solution 5:
Change template to:
<buttontwowaybind="counter">Click Me</button><p>Click Count: {{ counter.val }}</p>
and directive to:
.directive('twoway',
function() {
return {
scope: {
localValue: '=?bind'
},
link: function(scope, elem, attrs) {
scope.localValue = {
val: 0
};
elem.on('click', function() {
scope.localValue.val = scope.localValue.val + 1;
scope.$apply();
});
}
};
}
);
Post a Comment for "Angularjs Custom Directive Two Way Binding"