【问题标题】:Knockout datepicker binding淘汰日期选择器绑定
【发布时间】:2015-09-22 15:55:16
【问题描述】:

我的日期选择器绑定无法正常工作。 初始化时输入字段为空。
是否有人有适当的日期选择器处理程序来设置输入字段的初始值?

这是我的html代码:

function setMappingBindings() {
    obj.myCase(mapCase({ "serviceDate": "2015-09-03T00:00:00", "deadLineDate": "2014-09-16T00:00:00" }));
}
function mapCase(data) {
    var map = ko.mapping.fromJS(data);

    map.serviceDate = moment(map.serviceDate()).format("DD-MM-YYYY");
    map.deadLineDate = moment(map.deadLineDate()).format("L");
    return map;
}
var obj = {
    myCase: ko.observable(),
    testDate: ko.observable(moment().format('L')),

};
$(document).ready(function () {
     ko.bindingHandlers.datepicker = {
    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);
            }
        });
    },
    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) {
                widget.setValue();
            }
        }
    }
};

    $('.datepicker').datepicker();
    setMappingBindings();
    ko.applyBindings(obj, $("#page-wrapper")[0]);

});
<div class="row">
   <input type="text" maxlength="50" class="form-control datepicker" data-date-format="dd-mm-yyyy" data-bind="datepicker: myCase().serviceDate">
</div>
<div class="row">
   <input type="text" maxlength="50" class="form-control datepicker" data-date-format="dd-mm-yyyy" data-bind="datepicker: testDate">
</div>

【问题讨论】:

    标签: twitter-bootstrap knockout.js datepicker


    【解决方案1】:

    您可以使用输入标签上的 value 绑定来为输入设置一个初始值。

    像这样:value: testDate

    function setMappingBindings() {
        obj.myCase(mapCase({ "serviceDate": "2015-09-03T00:00:00", "deadLineDate": "2014-09-16T00:00:00" }));
    }
    function mapCase(data) {
        var map = ko.mapping.fromJS(data);
    
        map.serviceDate = moment(map.serviceDate()).format("DD-MM-YYYY");
        map.deadLineDate = moment(map.deadLineDate()).format("L");
        return map;
    }
    var obj = {
        myCase: ko.observable(),
        testDate: ko.observable(moment().format('L')),
    
    };
    $(document).ready(function () {
         ko.bindingHandlers.datepicker = {
        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);
                }
            });
        },
        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) {
                    widget.setValue();
                }
            }
        }
    };
    
        setMappingBindings();
        ko.applyBindings(obj, $("#page-wrapper")[0]);
    
    });
    <link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.0/css/bootstrap-datepicker.min.css" rel="stylesheet"/>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.3/moment.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.0/js/bootstrap-datepicker.min.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"/>
    <div class="row">
       <input type="text" maxlength="50" class="form-control datepicker" data-date-format="dd-mm-yyyy" data-bind="datepicker: myCase().serviceDate, value: myCase().serviceDate">
    </div>
    <div class="row">
       <input type="text" maxlength="50" class="form-control datepicker" data-date-format="dd-mm-yyyy" data-bind="datepicker: testDate, value: testDate">
    </div>

    【讨论】:

    • 这确实有效。不幸的是,日期选择器不会弹出选择的初始日期,并且当在日期选择器外部单击时,日期会从输入中消失。任何想法如何解决这个问题?
    • 我会使用moment-datepicker。它也有一个淘汰赛绑定处理程序。
    【解决方案2】:

    我知道这是一个相当老的问题,也许我的经验可以帮助别人。

    我在我的一个长期项目中使用bootstrap-datepickerlink 到产品页面),我确实在knockout 集成方面遇到了一些问题,包括分配作为本主题主题的初始日期。

    我尝试了不同的ko 自定义绑定到日期选择器,但似乎所有解决一个问题的方法都引入了一系列新问题。

    直到我遇到这个版本:http://jsfiddle.net/wtqsgtwm/89/,它似乎完美地满足了我的所有需求。

    请注意,它不需要单独的value 绑定来设置初始日期值。简单

    <input type="text" data-bind="datePicker: myDate" >
    

    够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-30
      • 2013-05-04
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      • 2017-12-17
      相关资源
      最近更新 更多