knockout.js - 如何将 knockoutjs 数据绑定(bind)与 winjs 日期选择器一起使用

标签 knockout.js winjs

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

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

我想使用 knockout 绑定(bind)到从 WinJS 生成的 3 个选择列表。有没有办法使用 knockout 声明式数据绑定(bind)来绑定(bind)到生成的选择列表?

最佳答案

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/

关于knockout.js - 如何将 knockoutjs 数据绑定(bind)与 winjs 日期选择器一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13804686/

相关文章:

knockout.js - knockout 内容可编辑绑定(bind)

knockout.js - 对 Breeze 导航属性进行排序

javascript - 与其他函数一起返回变量

javascript - WinJS Promise 进度函数未执行

javascript - WinJS 与 AngularJS

javascript - 使用订阅的 Knockout Js 复选框验证

javascript - 使用 Knockout.js 和 MVC 4 填充选择选项

javascript - 在 Visual Studio 2013 的 Windows Phone javascript 模板中启用状态栏

javascript - 在 ListVIew 中动态绑定(bind)项目

javascript - 如何使用 JavaScript 从 Windows 8 应用程序中的组 listView 中删除元素