【问题标题】:Updating bootstrap datepicker after initialization using KnockoutJS使用 KnockoutJS 初始化后更新引导日期选择器
【发布时间】:2014-08-10 03:25:49
【问题描述】:

我正在使用带有以下自定义 KnockoutJS 绑定的 Bootstrap 日期选择器,直到现在它对我来说都很好:

ko.bindingHandlers.datepicker = {
  init: function(element, valueAccessor, allBindingsAccessor) {
    //initialize datepicker with some optional options
    var options = allBindingsAccessor().datepicker || {};

    $(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);
      }                
    });
  },
  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());
      widget.setValue();            
    }
  }

};

现在,我有一种情况,我在 datepicker 初始化发生之后 获得了 startDateendDate 值。我在这里设置了一个示例:

http://jsfiddle.net/6WR5r/

日期选择器使用正确的日期初始化,但是当我点击“更改日期”按钮时,日期选择器没有更新,即使自定义绑定上的 update 函数被触发。

我尝试了 update 函数的不同版本,但没有成功:

update: function(element, valueAccessor, allBindingsAccessor)   {
  var options = allBindingsAccessor().datepicker || {};
  $(element).datepicker(options);
}

update: function(element, valueAccessor, allBindingsAccessor)   {
  $(element).datepicker('update');
}

唯一有效的是使用setStartDatesetEndDate 方法,如下所示:

update: function(element, valueAccessor, allBindingsAccessor) {
  var options = allBindingsAccessor().datepicker || {};

  $(element).datepicker('setStartDate', options.startDate);
  $(element).datepicker('setEndDate', options.endDate);
}

但我正在寻找更好的方法。有没有办法使用update 函数用新值更新日期选择器,而不必指定要更新的选项?

【问题讨论】:

  • 你在followinganswers 中看起来不太像interested...
  • 我最近得到的答案不足以将它们标记为已接受。
  • 也许您可以对它们发表评论以说明它们对您没有用处。感觉就像你问然后离开;它不会让人想帮忙

标签: javascript jquery knockout.js datepicker bootstrap-datepicker


【解决方案1】:

所以在两个问题中你让我写了两个丑陋的解决方案......

Apparently你需要删除插件并在你想更改startDateendDate时重新创建它:(

你的更新函数变成:

update: function(element, valueAccessor, allBindingsAccessor) {
    console.log("update fired");

     //when the view model is updated, update the widget
    if ($(element).data("datepicker")) {
        $(element).datepicker("remove");
        var options = allBindingsAccessor().datepicker || {};
        $(element).datepicker(options);
        $(element).data("datepicker").date = ko.utils.unwrapObservable(valueAccessor());
        $(element).data("datepicker").setValue();            
    } 
}

Demo

【讨论】:

  • 我宁愿有一个丑陋的解决方案也不愿没有解决方案:) 这很棒。感谢您及时的回复!还有一个问题。如果update 函数总是在init 之后触发,是否有必要在两个函数中保留日期选择器初始化代码(var options = ... $(element).datepicker(options);)?
  • 确实,您可以在此处的update 函数中处理日期选择器的创建。 doc 说(像你一样)update 函数也在 init 上被调用。
猜你喜欢
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 2015-12-27
  • 2013-12-18
相关资源
最近更新 更多