我为jQuery UI datepicker创建了一个angular指令。问题是指令在选择日期时不更新输入的ng-model。知道为什么吗?
答案 0 :(得分:30)
AngularJS实际上提供了一个特殊的控制器,用于与ngModel
进行交互,您可以在指令中使用它;只需将require: 'ngModel'
添加到指令定义中。
这为您的link
函数提供了第四个参数,这是您在require
中要求的控制器 - 在本例中是一个实例of ngModelController
。它有一个名为$setViewValue
的方法,您可以使用它来设置模型的值:
app.directive('datepicker', function() {
return {
require: 'ngModel',
link: function(scope, el, attr, ngModel) {
$(el).datepicker({
onSelect: function(dateText) {
scope.$apply(function() {
ngModel.$setViewValue(dateText);
});
}
});
}
};
});
关于ngModelController
的美妙之处在于它会自动处理验证和格式化(在特定输入type
的情况下)并与ngChange
回调等内容集成;查看this example:http://jsbin.com/ufoqan/6/edit
答案 1 :(得分:5)
可能有更好的方法,但这会奏效:
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 ?
}
});
}
};
});
你也问过为什么。原因是jquery发生在角度系统之外。您可以在$ apply方法下找到更多信息:docs
答案 2 :(得分:0)
@Michelle Tilley和@Jonah将你的指令链接到ngModel是正确的,但为什么你没有使用纯粹的Angular而不是jQuery的datePicker?
好吧,我代表ADMdtp
模块。它是纯粹的AngularJs dateTimePicker,有很多greate选项:
<adm-dtp ng-model="date" full-data="date_full"></adm-dtp>