knockout.js - 使用 Knockout-ES5 时如何访问自定义绑定(bind)中的可观察对象

标签 knockout.js knockout-es5-plugin

如果模型属性是 ko.observable(),则可以在自定义绑定(bind)中按如下方式访问这些属性。

var observable = valueAccessor();

使用 Knockout-ES5 插件时,如何在自定义绑定(bind)中获取 observable?检查下面的代码并查找注释“如何在此处获取 propertyName?”

JS Fiddle when not using Knockout-ES plugin礼貌 Another Look at Custom Bindings for KnockoutJS

Updated fiddle with model changed to use Knockout-ES plugin
ko.bindingHandlers.datepicker = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
        //initialize datepicker with some optional options
        var options = allBindingsAccessor().datepickerOptions || {};
        $(element).datepicker(options);

        //handle the field changing
        ko.utils.registerEventHandler(element, "change", function () {
            var observable = valueAccessor();
            if (!ko.isObservable(observable)) {                
                console.log("Not Observable");
                //How to get propertyName here?
                //ko.getObservable(viewModel, 'propertyName');
                return;
            }
            observable($(element).datepicker("getDate"));
        });

        //handle disposal (if KO removes by the template binding)
        ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
            $(element).datepicker("destroy");
        });

    },
    //update the control when the view model changes
    update: function(element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor()),
            current = $(element).datepicker("getDate");

        if (value - current !== 0) {
            $(element).datepicker("setDate", value);   
        }
    }
};

var viewModel = {
    myDate: new Date("11/01/2011"),
    setToCurrentDate: function() {
       this.myDate = new Date();   
    }
};

ko.track(viewModel);

ko.applyBindings(viewModel);

最佳答案

您可以将实际的 observable 传递给绑定(bind):

data-bind="datepicker: ko.getObservable($data, 'myDate') ..."

http://jsfiddle.net/xb6vR/1/

但这很丑陋。幸运的是,Knockout 确实提供了一种方法(未记录)从绑定(bind)中写入属性值:
//handle the field changing
ko.utils.registerEventHandler(element, "change", function () {
    var writable = valueAccessor();
    if (!ko.isObservable(writable)) {                
        var propWriters = allBindingsAccessor()._ko_property_writers;
        if (propWriters && propWriters.datepicker) {
            writable = propWriters.datepicker;
        } else {
            return;
        }
    }
    writable($(element).datepicker("getDate"));
});

http://jsfiddle.net/xb6vR/3/

关于knockout.js - 使用 Knockout-ES5 时如何访问自定义绑定(bind)中的可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16994320/

相关文章:

knockout.js - 没有使用自定义绑定(bind)和 defineProperty 调用 knockout 绑定(bind) value.update

javascript - Require JS with Knockout 组件在不正确的路径中寻找 js 文件

javascript - knockout 绑定(bind)处理程序传递对象数组

javascript - 根据 KnockoutJS 中先前选择的选择菜单填充选择菜单

javascript - 如何在 KnockoutJS 中的 ajax 调用后更新数组中的特定元素

javascript - 使用下拉列表预填充文本框进行 knockout 绑定(bind)

javascript - 模型属性更新时 UI 不更新,由 knockout ES5 跟踪

javascript - 如何制作 knockout 以在页面加载时填充数据

javascript - 与 observable 的 knockout 依赖