日期选择器中未设置 minDate
minDate not being set in date picker
在我看来,这就是我使用日期选择器的方式:
<input type="text" class="form-control datepicker" name="ChartStartDate1" id="dailySummaryDt" data-bind="datePicker: targetDate, minDate: viewModel.datePickerMinDate()" />
<span id="temp" data-bind="text:viewModel.datePickerMinDate()"></span>
带有 span 的最后一行完美运行。我创建该跨度只是为了检查我的模型是否具有正确的值。但是日期选择器没有选择那个值,我不确定为什么。
未设置日期选择器的 minDate
;换句话说,我无法为日期选择器设置最短日期。请注意以下操作正确:
minDate: new Date() or
minDate:new Date('01/10/2015')
这不起作用。如果我尝试调试我的绑定处理程序,在所有这些情况下,日期的值要么未定义要么无效:
minDate: new Date(viewModel.datePickerMinDate()) OR
minDate: viewModel.datePickerMinDate() OR
minDate: viewModel.datePickerMinDate
这是我的绑定处理程序的代码
ko.bindingHandlers.datePicker = {
init: function (element, valueAccessor, allBindings) {
var minDate = moment(allBindings.get('minDate') || ''),
maxDate = moment(allBindings.get('maxDate') || ''),
options = {
minDate: minDate.isValid() ? minDate.toDate() : undefined,
maxDate: maxDate.isValid() ? maxDate.toDate() : undefined,
onClose: function () { if ($.fn.valid) $(this).valid(); },
dateFormat: allBindings.get('format') || GGS.dateFormats.pickerDateFormat
},
dp = $(element).datepicker(options);
console.log('minDate ' + minDate + ' ' + moment.utc($("#ChartStartDate").val()).format('MM/DD/YYYY'));
dp.change(function () {
var observable = valueAccessor(),
unwrapped = ko.unwrap(observable)
current = unwrapped ? moment.utc(unwrapped) : null,
raw = dp.datepicker("getDate"),
localValue = raw ? moment(raw) : null, //n.b. not UTC; stupid jQuery UI
value = localValue ? moment.utc([localValue.year(), localValue.month(), localValue.date()]) : null //extract the date part to a UTC date
if (!value || (!current || !current.isSame(value, 'day'))) {
console.log('value = ' + value.toDate());
observable(value ? value.toDate() : value);
}
});
},
update: function (element, valueAccessor) {
var dp = $(element);
var observable = valueAccessor(),
unwrapped = ko.unwrap(observable),
value = unwrapped ? moment.utc(unwrapped) : null,
localValue = value ? moment([value.year(), value.month(), value.date()]) : null //make sure that jQuery UI shows the date we expect, rather than trying to convert to local time
;
dp.datepicker("setDate", localValue ? localValue.toDate() : localValue);
dp.blur();
},
}
好吧,正如评论中提到的,你只需要这样做
查看:
<input type="text" class="form-control datepicker" data-bind="datePicker:targetDate, minDate:datePickerMinDate()" />
<span id="temp" data-bind="text:targetDate"></span>
ViewModel:
var ViewModel = function () {
var self = this;
self.targetDate = ko.observable('01/10/2015');
self.datePickerMinDate = ko.observable('01/10/2015');
};
//In bindingHandler update
update: function (element, valueAccessor) {
var dp = $(element);
var observable = valueAccessor(),
unwrapped = ko.unwrap(observable)
//here you have to format the Date before setting
$(element).datepicker("setDate", unwrapped);
dp.blur();
}
工作fiddle供参考here
在我看来,这就是我使用日期选择器的方式:
<input type="text" class="form-control datepicker" name="ChartStartDate1" id="dailySummaryDt" data-bind="datePicker: targetDate, minDate: viewModel.datePickerMinDate()" />
<span id="temp" data-bind="text:viewModel.datePickerMinDate()"></span>
带有 span 的最后一行完美运行。我创建该跨度只是为了检查我的模型是否具有正确的值。但是日期选择器没有选择那个值,我不确定为什么。
未设置日期选择器的 minDate
;换句话说,我无法为日期选择器设置最短日期。请注意以下操作正确:
minDate: new Date() or
minDate:new Date('01/10/2015')
这不起作用。如果我尝试调试我的绑定处理程序,在所有这些情况下,日期的值要么未定义要么无效:
minDate: new Date(viewModel.datePickerMinDate()) OR
minDate: viewModel.datePickerMinDate() OR
minDate: viewModel.datePickerMinDate
这是我的绑定处理程序的代码
ko.bindingHandlers.datePicker = {
init: function (element, valueAccessor, allBindings) {
var minDate = moment(allBindings.get('minDate') || ''),
maxDate = moment(allBindings.get('maxDate') || ''),
options = {
minDate: minDate.isValid() ? minDate.toDate() : undefined,
maxDate: maxDate.isValid() ? maxDate.toDate() : undefined,
onClose: function () { if ($.fn.valid) $(this).valid(); },
dateFormat: allBindings.get('format') || GGS.dateFormats.pickerDateFormat
},
dp = $(element).datepicker(options);
console.log('minDate ' + minDate + ' ' + moment.utc($("#ChartStartDate").val()).format('MM/DD/YYYY'));
dp.change(function () {
var observable = valueAccessor(),
unwrapped = ko.unwrap(observable)
current = unwrapped ? moment.utc(unwrapped) : null,
raw = dp.datepicker("getDate"),
localValue = raw ? moment(raw) : null, //n.b. not UTC; stupid jQuery UI
value = localValue ? moment.utc([localValue.year(), localValue.month(), localValue.date()]) : null //extract the date part to a UTC date
if (!value || (!current || !current.isSame(value, 'day'))) {
console.log('value = ' + value.toDate());
observable(value ? value.toDate() : value);
}
});
},
update: function (element, valueAccessor) {
var dp = $(element);
var observable = valueAccessor(),
unwrapped = ko.unwrap(observable),
value = unwrapped ? moment.utc(unwrapped) : null,
localValue = value ? moment([value.year(), value.month(), value.date()]) : null //make sure that jQuery UI shows the date we expect, rather than trying to convert to local time
;
dp.datepicker("setDate", localValue ? localValue.toDate() : localValue);
dp.blur();
},
}
好吧,正如评论中提到的,你只需要这样做
查看:
<input type="text" class="form-control datepicker" data-bind="datePicker:targetDate, minDate:datePickerMinDate()" />
<span id="temp" data-bind="text:targetDate"></span>
ViewModel:
var ViewModel = function () {
var self = this;
self.targetDate = ko.observable('01/10/2015');
self.datePickerMinDate = ko.observable('01/10/2015');
};
//In bindingHandler update
update: function (element, valueAccessor) {
var dp = $(element);
var observable = valueAccessor(),
unwrapped = ko.unwrap(observable)
//here you have to format the Date before setting
$(element).datepicker("setDate", unwrapped);
dp.blur();
}
工作fiddle供参考here