javascript - 如何使用预定义的文本和值选项定义自定义 knockout 'options binding'

标签 javascript knockout.js

我们环境中的一个典型场景是允许用户选择服务器提供的选项列表(终端、产品、..),然后呈现请求的数据。

服务器提供的选项是名称,ID格式,因此经常使用以下 knockout 结构:

<select data-bind="options: serverOptions, optionsText: 'Name', optionsValue: 'ID', value: selectedOption>

最好创建一个名为“NamedIdOptions”的自定义绑定(bind)处理程序,在 allBindingsAccessor() 上指定 optionsText 和 optionsValue,然后重定向到标准选项绑定(bind)处理程序。

<select data-bind="NamedIdOptions: serverOptions, value: selectedOption"></select>

以前,我已经创建了自己的绑定(bind)处理程序来填充我自己的选项 - 但是,我更愿意使用选项绑定(bind)处理程序提供的框架。

我尝试了不同的方法,但都不太成功 - 选项绑定(bind)使用 allBindings['optionsValue'] 和 allBindings['optionsText'] 来访问值,而且我似乎无法设置这些。 (我想避免使用 applyBindingsToNode 方法并按照以下方式编写一些内容:

ko.bindingHandlers.NamedIdOptions = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel)
    {
        var allBindings = allBindingsAccessor();
        allBindings.*FORCESET*("optionsText", "Name");
        allBindings.*FORCESET*("optionsValue", "ID");

        retun ko.bindingHandlers.options.init.apply(this, arguments);
    },
    update: function (element, valueAccessor, allBindingsAccessor, viewModel)
    {
        retun ko.bindingHandlers.options.update.apply(this, arguments);
    }
}

但是,我似乎无法在 allBindings 上设置任何内容。

我不允许使用

allBindings['_ko_property_writers']['optionsText']("Name" );
allBindings['_ko_property_writers']['optionsValue']("ID" );

我真的更愿意避免在 init 构造中使用 applyBindingsToNode

Knockout - is it possible to combine standard select bindings with a custom binding?

现在有人能提供解决问题的简单方法吗?

最佳答案

您可以考虑使用 ko.applyBindingAccessorsToNode。这就是我在 KO 3.0 中开始这样做的方式:

ko.bindingHandlers.NamedIdOptions = {
    init: function(element, valueAccessor, allBindingsAccessor)
    {
        var injectedBindingValues = {        
            options: valueAccessor,
            optionsValue: function () { return "ID" },
            optionsText: function () { return "Name" }
        };

        ko.applyBindingAccessorsToNode(element, injectedBindingValues);

        //tell Knockout that we have already handled binding the children of this element
        //
        return { controlsDescendantBindings: true };        
    }
}

您可以在 this fiddle 中看到它的实际效果.

注意:我通常使用从服务器(C#、JSON.NET)发送的 JSON 模式来自动从 C# 属性或数据库模式元数据填充 UI 中的选项。我提炼了我的代码并对其进行了更改以匹配 OP 为实现问题的连续性所做的工作。但是,如果对 JSON 模式技术有任何兴趣,请联系我,我可以将其发布。

关于javascript - 如何使用预定义的文本和值选项定义自定义 knockout 'options binding',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20002952/

相关文章:

javascript - 更改 dropzone.js 的默认功能

javascript Riddle : 2 objects that seem identical with respect to constructor, 原型(prototype)和 __proto__ 链接,行为不同

javascript - 无法从 null 中读取属性 'length'

javascript - 在 d3.js 中绘制滚动/移动平均线

javascript - 在knockout js observableArray中加入函数?

javascript - 将属性分配给数组 js/jquery 中的值

javascript - 如何让 Knockout JS 在按键上进行数据绑定(bind)而不是失去焦点?

javascript - Knockback.js 主干集合仅将第一个元素添加到 UI

javascript - 挖空标签装订

javascript - 选择框不允许我设置默认值,加载/绑定(bind)将值重置为第一项