当 jQuery 日期选择器打开时,挖空更改会中断日期选择器
Knockout change while jQuery Datepicker is open breaks Datepicker
我已经设置了一个jsFiddle来演示我的问题。
我在做什么:
我正在使用带有jQuery
Datepicker
的Knockout
,如此问题所示。
我的模型包含一个observableArray
,其中包含具有日期属性的对象。Knockout 为每个对象呈现一个<input type="text">
,并使用 RP Niemeyer 的 datepicker
绑定将值绑定到日期。
出了什么问题:
如果用户在 KNOCKOUT 的模型更改(例如,添加新项)时打开了日期选取器,则日期选取器将停止正常工作。据我所知,在日期选取器打开时创建的最后一个<input type="text">
成为新的日期选取器目标。我需要修复绑定,以免发生这种情况。
示例 HTML:
<ul data-bind="foreach: dateBoxes">
<li>
<span data-bind="text: index"></span>
<input type="text" data-bind="datepicker: date"/>
</li>
</ul>
示例 Javascript:
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());
//handle date data coming via json from Microsoft
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);
}
}
};
var model;
var id = 0;
function DateBox(d) {
var self = this;
self.date = ko.observable(d);
self.index = ko.observable(id++);
}
function Model() {
var self = this;
self.dateBoxes = ko.observableArray([]);
self.changeCount = function() {
if (self.dateBoxes().length < 2) {
self.dateBoxes.push(new DateBox(new Date()));
} else if (self.dateBoxes().length > 1) {
self.dateBoxes.splice(0,1);
}
}
self.tick = function() {
self.changeCount();
setTimeout(function() {
self.tick();
}, 5000);
}
self.tick();
}
model = new Model();
ko.applyBindings(model);
注意:此答案不完整。但是,由于它太大而无法发表评论,并且可能对(解决方案)有所帮助,无论如何,我冒昧地将其作为答案发布。任何可以完成此答案的人都被邀请通过编辑或衍生到另一个更好的答案来完成。
似乎破坏派对的事情(取自文档,强调我的):
当绑定首次应用于元素时,将调用一次,每当关联的可观察量更改值时,将再次调用此值。
如果我在第一次更新中阻止update
进行datepicker
调用,则日期选择器将不再中断(但确实会出现其他问题)。对于init
,我在末尾添加了这一行:
element.isFirstRun = true;
然后,update
方法将在datepicker
调用之前执行以下操作:
if (element.isFirstRun) {
$(element).val(value);
element.IsFirstRun = false;
return;
}
请参阅此更新的小提琴以获取结果,它们是:
- 提到的场景现在更新了正确的文本框(一件好事);
- 初始值现在是一个更详细的 DateTime 字符串,并在更新后保持这种状态(有点不好);
希望这将有助于达成更完整的解决方案。
相关文章:
- jquery日期选择器年份范围默认值
- jquery日期选择器失去了交互性
- 正在搜索JavaScript日期选择器滑块
- 如何在多个jQueryUI日期选择器中屏蔽特定日期
- jquery日期选择器显示与值不同的文本
- JQuery UI日期选择器:在选择出发日期时自动弹出返回日期
- Angular UI启动日期选择器问题
- 奇怪的日期选择器行为,与模糊有关
- 我希望这个日期选择器可以从1990年到2000年之间的年份中选择日期
- keith wood日期选择器日期格式和语言
- 在日期更改后更新Angular UI引导程序日期选择器选项
- Jquery UI日期选择器不关注输入
- Javascript两个日期选择器冲突
- 动态添加的标记不会'无法正确使用日期选择器
- 日期选择器无法使用javascript显示
- AngularJS自定义日期选择器指令
- 他们网站上的代码出现启动日期选择器错误
- 从第一个日期选择器定义第二个日期选择器的开始日期
- 更改日期选择器格式
- 带有推特助推器的日期选择器出现了,但没有't更改日期