Reputation: 9397
I have created an angular directive for my jQuery UI datepicker. The problem is that the directive doesn't update the input's ng-model when a date is selected. Any idea why?
http://jsbin.com/ufoqan/1/edit
Upvotes: 17
Views: 33461
Reputation: 2542
@Michelle Tilley and @Jonah are right about linking your directive to ngModel, but why you didn't use datePicker that is pure Angular instead of jQuery?
Well, i represent ADMdtp
module. It's pure AngularJs dateTimePicker with lots of greate options:
<adm-dtp ng-model="date" full-data="date_full"></adm-dtp>
Upvotes: 0
Reputation: 159105
AngularJS actually provides a special controller for interacting with ngModel
that you can use inside your directives; just add require: 'ngModel'
to your directive definition.
This gives you a fourth paramter to your link
function, which is the controller you asked for in require
--in this case, an instance of ngModelController
. It has a method called $setViewValue
you can use to set the value of the model:
app.directive('datepicker', function() {
return {
require: 'ngModel',
link: function(scope, el, attr, ngModel) {
$(el).datepicker({
onSelect: function(dateText) {
scope.$apply(function() {
ngModel.$setViewValue(dateText);
});
}
});
}
};
});
The beautiful thing about ngModelController
is it automatically takes care of validation and formatting (in the case of a specific input type
) and integration with things like ngChange
callbacks; check out this example: http://jsbin.com/ufoqan/6/edit
Upvotes: 32
Reputation: 16202
There may be a better way, but this will work:
http://jsbin.com/ufoqan/4/edit
app.directive('datepicker', function() {
return {
link: function(scope, el, attr) {
$(el).datepicker({
onSelect: function(dateText) {
console.log(dateText);
var expression = attr.ngModel + " = " + "'" + dateText + "'";
scope.$apply(expression);
console.log(scope.startDate);
// how do i set this elements model property ?
}
});
}
};
});
You also asked why. The reason is that jquery happens outside the angular system. You can find more info here under the $apply method: docs
Upvotes: 6