我们环境中的典型场景是允许用户选择服务器提供的选项列表(终端,产品......),然后显示请求的数据 .
服务器提供的选项是Name,ID格式,因此以下的knockout构造经常使用:
<select data-bind="options: serverOptions, optionsText: 'Name', optionsValue: 'ID', value: selectedOption>
最好在allBindingsAccessor()上创建一个名为'NamedIdOptions'的自定义bindingHandler,指定optionsText和optionsValue,然后重定向到标准选项绑定处理程序 .
即
<select data-bind="NamedIdOptions: serverOptions, value: selectedOption"></select>
以前,我已经制作了自己的绑定处理程序,它填充了我自己的选项 - 但是,我更喜欢使用选项绑定处理程序提供的框架 .
我尝试了不同的方法而没有太大的成功 - 选项绑定使用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?
现在有人关于这个问题的简单解决方案吗?
4 回答
您可以考虑使用ko.applyBindingAccessorsToNode . 这就是我在KO 3.0中开始这样做的方法:
您可以在this fiddle中查看它的运行情况 .
注意:我通常使用从服务器(C#,JSON.NET)发送的JSON模式来自动化从C#属性或数据库模式元数据中填充UI中的选项 . 我提炼了我的代码并对其进行了更改以匹配OP对问题的连续性所做的事情 . 但是如果对JSON模式技术有任何兴趣,那就打击我吧,我可以发布它 .
好的 - 我最后还是将节点绑定应用于节点:
它似乎按预期工作 - 我对值和selectedOptions有点不确定 - 它们有'after'设置为选项 . 我想在绑定值之前编写NamedIdOptions时我是安全的吗?
转发呼叫时,你不能伪造整个allBindingsAccessor参数吗?
编辑:添加了一些代码,将现有的allBindingsAccessor与手动伪绑定相结合
我最终得到了以下解决方案,它也允许制作简单的dependendt过滤器 - 它使用下划线,但这只是为了方便: