【问题标题】:how to use knockoutjs data binding with winjs datepicker如何将 knockoutjs 数据绑定与 winjs datepicker 一起使用
【发布时间】:2012-12-11 06:43:35
【问题描述】:

我使用以下代码创建了一个 DataPicker 控件。

<div id="date" data-win-control="WinJS.UI.DatePicker"></div>

我想使用敲除绑定到从 WinJS 生成的 3 个选择列表。有没有办法使用淘汰声明性数据绑定来绑定到生成的选择列表?

【问题讨论】:

  • 您想使用敲除来设置选择器显示的日期,还是想使用绑定来实际填充选择的内容?两个截然不同的答案。
  • @ChrisTavares 我正在尝试绑定选择器显示的日期。

标签: knockout.js winjs


【解决方案1】:
ko.bindingHandlers['winjsDatePicker'] = {
    init: function (element, valueAccessor, allBindingsAccessor) {
        var value = valueAccessor(),
            allBindings = allBindingsAccessor(),
            options = allBindings['winjsDatePickerOptions'] || {};
        options['current'] = value;

        // Flatten the options for DatePicker
        var dpOptions = {};
        ko.utils.arrayForEach([
            'calendar', 'current', 'datePattern', 'disabled', 'element',
            'maxYear', 'minYear', 'monthPattern', 'yearPattern'
        ], function (prop) {
            if (options.hasOwnProperty(prop)) {
                dpOptions[prop] = ko.utils.unwrapObservable(options[prop]);
            }
        });

        // Use jQuery to store the value-observable with the element
        $(element).data('winjsDatePickerCurrent', value);

        // Create the DatePicker, and pass it the options
        var dp = new WinJS.UI.DatePicker(element, dpOptions);

        // Wire up the onchange event
        dp.addEventListener("change", function() {
            var value = $(element).data('winjsDatePickerCurrent');
            if (ko.isWriteableObservable(value)) {
                value(dp.current);
            }
        });
    },
    update: function (element, valueAccessor, allBindingsAccessor) {
        var dp = element.winControl,
            value = valueAccessor(),
            allBindings = allBindingsAccessor(),
            options = allBindings['winjsDatePickerOptions'] || {};
        options['current'] = value;

        // Update the value-observable
        $(element).data('winjsDatePickerCurrent', value);

        // Update any properties
        ko.utils.arrayForEach([
            'calendar', 'current', 'datePattern', 'disabled', 'element',
            'maxYear', 'minYear', 'monthPattern', 'yearPattern'
        ], function (prop) {
            if (options[prop] !== undefined) {
                dp[prop] = ko.utils.unwrapObservable(options[prop]);
            }
        });
    }
};
<div data-bind="winjsDatePicker: date"></div>​
<div data-bind="winjsDatePicker: date, winjsDatePickerOptions: { minYear: 2012 }"></div>​

http://jsfiddle.net/MizardX/rs8Cd/

【讨论】:

    【解决方案2】:

    我可能会研究自定义绑定。您仍然可以为 DatePicker 使用声明性标记,但在自定义绑定中实例化 DatePicker 可能更容易。

    注意:我没有机会对此进行测试,但它可能会为您指明正确的方向。另外,我认为在 WinJS 世界中,他们更喜欢你做data-win-bind="winControl.current: yourprop",但如果你想使用 KO,可能有办法。

    ko.bindingHandlers.winDatePicker = {
        init: function (element, valueAccessor) {
            var currentDate = valueAccessor() || {};
    
            // In order for this to be true, you would had to call WinJS.UI.processAll() and *then* ko.applyBindings()
            if (element.winControl) {
                element.winControl.current = currentDate;
            }
    
        },
        update: function (element, valueAccessor) {
            var currentDate = valueAccessor() || {};
    
            if (element.winControl) {
                element.winControl.current = currentDate;
            }
        }
    };
    
    /// <div data-bind="winDatePicker: myObservable" data-win-control="WinJS.UI.DatePicker" />
    

    你可以看看我提出的这个要点。但是没有任何保证!在使用此功能之前,您需要致电 WinJS.Binding.processAllhttps://gist.github.com/4183235

    【讨论】:

      猜你喜欢
      • 2013-01-03
      • 2011-09-17
      • 2017-11-08
      • 2016-04-15
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      相关资源
      最近更新 更多