이 플러그인을 사용하고 있습니다 : http://eonasdan.github.io/bootstrap-datetimepicker/
날짜 목록 / 배열을로드하기 위해 서버에 Ajax 요청을 보내는 DropDown이 있으며 DateTime 선택기에서 해당 배열의 날짜 만 활성화하면됩니다. JSFiddle에서 비슷한 시나리오를 만들었습니다. http://jsfiddle.net/mdawood1991/sd2gmhop/12/
다음은 HTML입니다.
<div class="row">
<div class="col-md-4">
<select class="form-control" data-bind="options: Countries, optionsCaption: '-- Please Select --', value: SelecteItem"></select>
</div>
<div class="col-md-4">
<label class="main-label">Date</label>
<div class='input-group date'>
<input type='text' class="form-control" data-bind="datepicker: SelectedDate" /> <span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span>
</div>
</div>
<div class="col-md-4"></div>
</div>
<pre data-bind="text: ko.toJSON($data, null, 2)"></pre>
내 DateTime 사용자 지정 바인더 :
ko.bindingHandlers.datepicker = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
//initialize datepicker with some optional options
var options = {
format: 'DD/MM/YYYY HH:mm',
defaultDate: valueAccessor()()
};
if (allBindingsAccessor() !== undefined) {
if (allBindingsAccessor().datepickerOptions !== undefined) {
options.format = allBindingsAccessor().datepickerOptions.format !== undefined ? allBindingsAccessor().datepickerOptions.format : options.format;
}
}
$(element).datetimepicker(options);
//when a user changes the date, update the view model
ko.utils.registerEventHandler(element, "dp.change", function (event) {
var value = valueAccessor();
if (ko.isObservable(value)) {
value(event.date);
}
});
var defaultVal = $(element).val();
var value = valueAccessor();
value(moment(defaultVal, options.format));
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
// when ViewModel is updated, update the DatePicker Control
var thisFormat = 'DD/MM/YYYY HH:mm';
if (allBindingsAccessor() !== undefined) {
if (allBindingsAccessor().datepickerOptions !== undefined) {
thisFormat = allBindingsAccessor().datepickerOptions.format !== undefined ? allBindingsAccessor().datepickerOptions.format : thisFormat;
}
}
var value = valueAccessor();
var unwrapped = ko.utils.unwrapObservable(value());
if (unwrapped === undefined || unwrapped === null) {
element.value = new moment(new Date());
console.log("undefined");
} else {
element.value = unwrapped.format(thisFormat);
}
}
};
그리고 ViewModel :
function viewModel() {
var self = this;
self.Countries = ko.observableArray(['France', 'Germany', 'Spain']);
self.SelecteItem = ko.observable();
self.EnabledDates = ko.observableArray();
self.SelectedDate = ko.observable(new Date());
self.SelecteItem.subscribe(function () {
self.EnabledDates = [];
if (self.SelecteItem() == "France") {
self.EnabledDates.push(new moment('Date(1431514972533)'));
self.EnabledDates.push(new moment('Date(1431082972533)'));
} else {
self.EnabledDates.push(new moment(new Date()));
}
});
}
var testviewModel = new viewModel();
ko.applyBindings(testviewModel);
EnabledDates
배열의 날짜 만 활성화하려면 어떻게해야합니까 ?
EnabledDates를 관찰하고 변경 사항을 달력에 적용하는 사용자 지정 바인딩을 사용할 수 있습니다.
활성화 된 날짜를 설정하는 방법에 대한 몇 가지주의 사항 :
1 변수에 간단한 배열을 할당하여 관찰 가능한 배열을 실제로 처리합니다.
self.EnabledDates = [];
해야한다:
self.EnabledDates([]);
2 배열에 요소를로드 할 때마다 해당 Observable의 모든 감시자 (계산 및 바인딩)를 트리거하므로 배열을로드하는 방법이 효율적이지 않습니다. 가장 좋은 방법은 임시 배열을 사용하여 활성화 된 모든 날짜를로드하는 것입니다. 그런 다음 해당 배열을 관찰 가능한 배열에로드합니다. 이렇게하면 한 번만 트리거됩니다.
self.SelecteItem.subscribe(function () {
var tempArray = [];
if (self.SelecteItem() == "France") {
tempArray.push(new moment('Date(1431514972533)'));
tempArray.push(new moment('Date(1431082972533)'));
} else {
tempArray.push(new moment(new Date()));
}
self.EnabledDates(tempArray);
});
이에 대한 자세한 내용은 http://www.knockmeout.net/2012/04/knockoutjs-performance-gotcha.html을 참조 하십시오.
마지막으로 사용자 지정 바인딩 :
ko.bindingHandlers.enableDisable = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
ko.bindingHandlers.enableDisable.update(element,valueAccessor);
},
update: function (element, valueAccessor) {
var enabledDates = valueAccessor()();
//apply disabled dates
$(element).data("DateTimePicker").enabledDates(enabledDates);
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다