以下是日期字段的html:
<div class='form-group'>
<label>Check out</label>
<input type='text' ng-model='checkOut' class='form-control' data-date-format="yyyy-mm-dd" placeholder="Check out" required id="check-out">
</div>
<script>
$('#check-out').datepicker();
</script>
日期选择器显示在输入字段中。但是,如果我在我的控制器中执行此操作:
console.log($scope.checkOut);
我得到undefined in the javascript console
。
怎么解决这个问题?
是否有更好的方法将bootstrap-datepicker
与angularjs
一起使用?
我不想使用angular-ui/angular-strap
,因为我的项目是用javascript库膨胀的。
答案 0 :(得分:23)
正如@lort建议的那样,您无法从控制器访问datepicker模型,因为datepicker有自己的私有范围。
如果您设置:ng-model="parent.checkOut"
并在控制器中定义:$scope.parent = {checkOut:''};
您可以使用:$scope.parent.checkOut
答案 1 :(得分:20)
我正在使用bootstrap 3 datepicker https://eonasdan.github.io/bootstrap-datetimepicker/和angularjs,我和ng-model有同样的问题,所以我使用bootstrap jquery函数获取输入日期值,下面是我控制器中的代码,它适用于我。
HTML
<input class="form-control" name="date" id="datetimepicker" placeholder="select date">
控制器
$(function() {
//for displaying datepicker
$('#datetimepicker').datetimepicker({
viewMode: 'years',
format: 'DD/MM/YYYY',
});
//for getting input value
$("#datetimepicker").on("dp.change", function() {
$scope.selecteddate = $("#datetimepicker").val();
alert("selected date is " + $scope.selecteddate);
});
});
答案 2 :(得分:2)
我自己就找到了解决方法。我只是将模型名称传递给指令(我在网上找到了大部分)。这将在日期更改时设置模型的值。
<input data-ng-model="datepickertext" type="text" date-picker="datepickertext" />{{datepickertext}}
angular.module('app').directive('datePicker', function() {
var link = function(scope, element, attrs) {
var modelName = attrs['datePicker'];
$(element).datepicker(
{
onSelect: function(dateText) {
scope[modelName] = dateText;
scope.$apply();
}
});
};
return {
require: 'ngModel',
restrict: 'A',
link: link
}
});
答案 3 :(得分:2)
我正在使用https://eonasdan.github.io/bootstrap-datetimepicker/中的Angular JS 1.5.0和Bootstrap 3 Datetimepicker
经过一段时间的努力,我终于找到了一个解决方案,让它对我有用:)
JSFiddle:http://jsfiddle.net/aortega/k6ke9n2c/
HTML代码:
<div class="form-group col-sm-4" >
<label for="birthdate" class="col-sm-4">Birthday</label>
<div class="col-sm-8">
<div class="input-group date" id="birthdate" ng-model="vm.Birthdate" date-picker>
<input type="text" class="form-control netto-input" ng-model="vm.Birthdate" date-picker-input>
<span class="input-group-addon">
<span class="glyphicon glyphicon-calendar"></span>
</span>
</div>
</div>
</div>
<div class="form-group col-sm-4">
<label for="birthdateText" class="col-sm-4">Model:</label>
<div class="col-sm-8">
<input type="text" class="form-control netto-input" ng-model="vm.Birthdate">
</div>
</div>
</body>
App.js:
只需控制器设置viewmodels Birtdate属性:
var app = angular.module('exampleApp',[]);
app.controller('ExampleCtrl', ['$scope', function($scope) {
var vm = this;
vm.Birthdate = "1988-04-21T18:25:43-05:00";
}]);
第一个指令是初始化 datetimepicker 并监听dp.change事件。
更改后 - ngModel也会更新。
// DatePicker -> NgModel
app.directive('datePicker', function () {
return {
require: 'ngModel',
link: function (scope, element, attr, ngModel) {
$(element).datetimepicker({
locale: 'DE',
format: 'DD.MM.YYYY',
parseInputDate: function (data) {
if (data instanceof Date) {
return moment(data);
} else {
return moment(new Date(data));
}
},
maxDate: new Date()
});
$(element).on("dp.change", function (e) {
ngModel.$viewValue = e.date;
ngModel.$commitViewValue();
});
}
};
});
第二个指令是观察ngModel,并在更改时触发输入onChange事件。这也将更新 datetimepicker 视图值。
// DatePicker Input NgModel->DatePicker
app.directive('datePickerInput', function() {
return {
require: 'ngModel',
link: function (scope, element, attr, ngModel) {
// Trigger the Input Change Event, so the Datepicker gets refreshed
scope.$watch(attr.ngModel, function (value) {
if (value) {
element.trigger("change");
}
});
}
};
});
答案 4 :(得分:2)
我遇到同样的问题并像这样解决
在html部分添加
<input class="someting" id="datepicker" type="text" placeholder="Dae" ng-model=""/>
在Controller调用中简单
$scope.btnPost = function () {
var dateFromHTML = $('#datepicker').val();
答案 5 :(得分:1)
您是否尝试过AngularUI引导程序?它具有以角度(包括日期选择器)重写的所有引导程序模块:http://angular-ui.github.io/bootstrap/
答案 6 :(得分:0)
解决方法之一:将id字段设置为输入,然后调用document.getElementById(&#39; input_name&#39;)。value以获取输入字段的值。
答案 7 :(得分:0)
使用this datepicker我遇到了同样的问题。我用一个小技巧解决了它。
在输入标记中,我添加了一个新属性(dp-model
):
<input class="form-control dp" type="text" dp-model="0" />
<input class="form-control dp" type="text" dp-model="1" />
...
然后在js文件中我以这种方式强制绑定:
$scope.formData.dp = []; // arrays of yours datepicker models
$('.dp').datepicker().on('changeDate', function(ev){
$scope.formData.dp[$(ev.target).attr('dp-model')] = $(ev.target).val();
});
答案 8 :(得分:0)
这对我有用:
设置
ng-model="date"
角度控制器上的
:
$scope.date = ''; $('#check-out').datepicker().on('changeDate', function (ev) { $scope.date= $('#check-out').val(); $scope.$digest(); $scope.$watch('date', function (newValue, oldValue) { $scope.date= newValue; }); });
我的实际问题是模型的值没有反映,直到范围上的另一个组件发生了变化。
答案 9 :(得分:0)
即时使用this和我的代码:
this.todayNow = function () {
var rightNow = new Date();
return rightNow.toISOString().slice(0,10);
};
$scope.selecteddate = this.todayNow();
$(function() {
//for displaying datepicker
$('.date').datepicker({
format: 'yyyy-mm-dd',
language:'fa'
});
//for getting input value
$('.date').on("changeDate", function() {
$scope.selecteddate = $(".date").val();
});
});
答案 10 :(得分:0)
要解决此问题,我的HTML看起来像这样:
<div class='input-group date' id='datetimepicker1'>
<input type='text' ng-model="date.arrival" name="arrival" id="arrival"
class="form-control" required />
<span class="input-group-addon">
<span class="glyphicon glyphicon-calendar"></span>
</span>
</div>
我的ng-model不会更新,所以我用它来解决它:
$("#datetimepicker1").on("dp.change", function (e) {
$scope.date.arrival = $("#arrival").val(); // pure magic
$('#datetimepicker2').data("DateTimePicker").minDate(e.date); // this line is not relevant for this example
});