【问题标题】:binding datetime in knockout view model在淘汰视图模型中绑定日期时间
【发布时间】:2018-09-20 00:24:03
【问题描述】:

我尝试了所有我能遇到的可能性,但日期选择器没有在我的视图模型上触发更新。环顾四周,我可以整理出以下内容:

ko.bindingHandlers.datepicker = {
    init: function (element, valueAccessor, allBindings) {
        //initialize datepicker with some optional options
        var options = allBindings.get('options') || {
            format: 'DD MMMM YYYY',
            defaultDate: valueAccessor()()
        };

        $(element).datetimepicker(options);

       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("DateTimePicker");
        var value = ko.unwrap(valueAccessor()); //I can see the initial value when page first load

        if (widget) {
            widget.date = value;
            if (widget.date) {
                $(element).datetimepicker({
                    date: value
                });
            }
       }
    }
};


var viewModel = ko.mapping.fromJS(data, mapping);

// continue with some tweaking

 // DateOfThing comes from c# DateTime type

 // on console window
 // ko.isObservable(viewModel.DateOfThing) // = true

  vm.DateOfThing.subscribe(function(){
    // never fires
  }

绑定:

<input asp-for="DateOfThing" class="form-control" type="text" data-bind="datepicker: DateOfThing" />

我可以看到第一次加载页面时调用了处理程序,但 UI 没有更新。之后我可以选择一个日期,但只有 UI 会更新。我已经尝试了所有我能遇到的可能性,但没有成功。

【问题讨论】:

    标签: knockout.js event-handling bootstrap-datetimepicker


    【解决方案1】:

    docs 中,他们已经给出了用于创建 Knockout 处理程序的部分。试着把这个和你的比较一下?特别是事件名称dp.change,而不是changeDate

    ko.bindingHandlers.dateTimePicker = {
        init: function (element, valueAccessor, allBindingsAccessor) {
            //initialize datepicker with some optional options
            var options = allBindingsAccessor().dateTimePickerOptions || {};
            $(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)) {
                    if (event.date != null && !(event.date instanceof Date)) {
                        value(event.date.toDate());
                    } else {
                        value(event.date);
                    }
                }
            });
    
            ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
                var picker = $(element).data("DateTimePicker");
                if (picker) {
                    picker.destroy();
                }
            });
        },
        update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
    
            var picker = $(element).data("DateTimePicker");
            //when the view model is updated, update the widget
            if (picker) {
                var koDate = ko.utils.unwrapObservable(valueAccessor());
    
                //in case return from server datetime i am get in this form for example /Date(93989393)/ then fomat this
                koDate = (typeof (koDate) !== 'object') ? new Date(parseFloat(koDate.replace(/[^0-9]/g, ''))) : koDate;
    
                picker.date(koDate);
            }
        }
    };
    

    【讨论】:

    • 我收到错误onChangeDateTime is not recognized
    • 大声笑.. 如果您一开始就提到这一点,那就太好了。无论如何,您的插件的文档中有一个用于 Knockout eonasdan.github.io/bootstrap-datetimepicker/Installing 的部分。更改事件称为“dp.change”。那你为什么要用changeDate 作为事件呢?
    • 是的。虽然我不得不柚木一点。 koDate = (typeof (koDate) !== 'object') ? new Date(parseFloat(koDate.replace(/[^0-9]/g, ''))) : koDate; 不是为我剪的。日期也保存在Utc 中,这也让我从悬崖上掉了下来。但感谢您为我指明了正确的方向,这是一个突破。
    猜你喜欢
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2012-06-17
    • 1970-01-01
    相关资源
    最近更新 更多