我知道这个问题之前已被问过很多次......但我已经尝试了所有的解决方案而且没有一个正在工作......因此又要求......
如何将json日期绑定到knockout元素...下面是我的代码......
@ Html.Bootstrap()。ControlGroup()。TextBoxFor(x => x.DateOfBirth).HtmlAttributes(new {data_bind =“kodate:DateOfBirth,datepickerOptions:new Date()”,@ class =“datepicker” })
$(function () {
$('.datepicker').datepicker({
autoclose: true
});
});
<input data-bind="kodate: startdate" class="datepicker"/>
kodate定义如下
ko.bindingHandlers.kodate = {
init: function (element, valueAccessor, allBindingsAccessor) {
//initialize datepicker with some optional options
var options = allBindingsAccessor().datepickerOptions || {};
$(element).datepicker(options);
//when a user changes the date, update the view model
ko.utils.registerEventHandler(element, "changeDate", function (event) {
var value = valueAccessor();
if (ko.isObservable(value)) {
value(event.date);
}
});
ko.utils.registerEventHandler(element, "change", function () {
var value = valueAccessor();
if (ko.isObservable(value)) {
value(new Date(element.value));
}
});
},
update: function (element, valueAccessor) {
var widget = $(element).data("datepicker");
//when the view model is updated, update the widget
if (widget) {
widget.date = ko.utils.unwrapObservable(valueAccessor());
if (!widget.date) {
return;
}
if (_.isString(widget.date)) {
widget.date = new Date(parseInt(widget.date.replace(/\/Date\((.*?)\)\//gi, "$1")));
//widget.date = new Date(widget.date);
}
widget.setValue();
}
},
update_old: function (element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
//handle date data coming via json from Microsoft
if (String(value).indexOf('/Date(') == 0) {
value = new Date(parseInt(value.replace(/\/Date\((.*?)\)\//gi, "$1")));
}
$(element).datepicker("setValue", value);
}
};
现在日期正确显示...但是当我发布日期时...它以json格式发布,模型绑定器无法将json日期(/ Date(1339230900000)/)转换为实际日期,因此日期在服务器端保持为空......
如何确保模型绑定器将json日期/日期(1339230900000)/转换为服务器端DateTime或如何以不同格式发布日期,以便模型绑定器能够识别日期?
有趣的是,如果我更改日期,然后以ISO格式发布,但如果我不更改日期,那么它以json格式发布...所以可能是init代码有问题... < / p>我正在使用bootstrap-datepicker:https://github.com/eternicode/bootstrap-datepicker
非常感谢任何帮助...
答案 0 :(得分:2)
最简单的方法是使用客户端库(如Moment.js)正确格式化日期,同时保持Knockout提供的双向数据绑定。一个简单的入门方法是使用如此处所示的轻量级插件 - http://makingsense.github.io/moment-datepicker/
虽然您不需要使用该插件,但您只需编写自己的自定义绑定处理程序来处理获取和设置日期。我过去使用过的一个例子 -
注册绑定处理程序以格式化要绑定的日期 -
ko.bindingHandlers.datepicker = {
init: function (element, valueAccessor, allBindingsAccessor) {
//initialize datepicker with some optional options
var options = allBindingsAccessor().datepickerOptions || {};
$(element).datepicker(options);
//handle the field changing
ko.utils.registerEventHandler(element, "change", function () {
var observable = valueAccessor();
observable($(element).datepicker("getDate"));
});
//handle disposal (if KO removes by the template binding)
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
$(element).datepicker("destroy");
});
},
update: function (element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
if (String(value).indexOf('/Date(') == 0) {
value = new Date(parseInt(value.replace(/\/Date\((.*?)\)\//gi, "$1")));
}
var current = $(element).datepicker("getDate");
if (value - current !== 0) {
$(element).datepicker("setDate", value);
}
}
};
然后加价 -
<div class="span4">
<label>Start Date : </label><input data-bind="datepicker: startDate, datepickerOptions: { maxDate: new Date() }" />
</div>
注意:此答案来自其他答案的汇总。