Javascript 如何订购淘汰绑定?
我正在使用knockout.js。我陷入了一个有点奇怪的境地(很难解释,但我正在努力,如果我不清楚,很抱歉)。我在单个选择列表上使用自定义绑定和选项绑定:Javascript 如何订购淘汰绑定?,javascript,jquery,knockout.js,Javascript,Jquery,Knockout.js,我正在使用knockout.js。我陷入了一个有点奇怪的境地(很难解释,但我正在努力,如果我不清楚,很抱歉)。我在单个选择列表上使用自定义绑定和选项绑定: <select data-bind="options : arrayOfOptions, optionsText: 'Name', optionsValue: 'Name', chosen: { }"> </select> ko.bindingHandlers.chosen = {
<select data-bind="options : arrayOfOptions, optionsText: 'Name',
optionsValue: 'Name', chosen: { }">
</select>
ko.bindingHandlers.chosen = {
init: function (element, valueAccessor, allBindingAccessor,
viewModel, bindigContext) {
var options = ko.utils.unwrapObservable(valueAccessor() || {});
$(element).chosen(options);
}
};
ko.bindingHandlers.selected={
init:函数(元素、valueAccessor、allBindingAccessor、,
视图模型,bindigContext){
var options=ko.utils.unwrapObservable(valueAccessor()| |{});
$(元素)。选择(选项);
}
};
此处,在运行时,selectlist将填充ArrayOfoOptions
数组中的所有可用选项,并且Selected
是一个自定义绑定,我在选择列表中应用了
现在,我在这里面临的问题是,在自定义绑定中,当我在选择列表上应用choose plugin时,选择列表中没有填充
ArrayOfoOptions
数组中的选项。在一个简单的术语中,表示在选项绑定
之前执行自定义绑定
。谁能给我一个解决方案,让自定义绑定后应用选项绑定 将对所选的呼叫移动到更新中
--
--
或者,您可以使用setTimeout
将对selected
的调用移动到执行队列的底部。这将给敲除选项绑定时间,以便在所选的尝试转换之前完成其工作
ko.bindingHandlers.chosen = {
init: function (element, valueAccessor, allBindingAccessor,
viewModel, bindingContext) {
var options = ko.utils.unwrapObservable(valueAccessor() || {});
setTimeout(function() { $(element).chosen(options); }, 0);
}
};
})
这对我来说适用于KO JS 3.0虽然上面的答案可能解决了前面提到的问题,但它们似乎无法定制您选择的下拉菜单,例如通过传递{'disable_search':true}来禁用搜索
我建议进行以下修改,以允许在绑定中传递选定的自定义项
<select data-bind="options : arrayOfOptions, optionsText: 'Name',
optionsValue: 'Name', chosen: { 'disable_search': true }">
</select>
ko.bindingHandlers.chosen = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var options = allBindingsAccessor().options;
var chosenOptions = allBindingsAccessor().chosen;
options.subscribe(function (newValue) {
$(element).chosen(chosenOptions);
$(element).trigger("chosen:updated");
});
var value = allBindingsAccessor().value;
value.subscribe(function (newValue) {
$(element).trigger("chosen:updated");
});
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
if (element.options.length > 0) {
var chosenOptions = allBindingsAccessor().chosen;
$(element).chosen(chosenOptions);
$(element).trigger("chosen:updated");
}
}
};
ko.bindingHandlers.selected={
init:函数(元素、valueAccessor、allBindingsAccessor、viewModel){
var options=allBindingsAccessor().options;
var chosenOptions=allBindingsAccessor()。已选择;
选项。订阅(函数(newValue){
$(元素)。选择(选择选项);
$(元素).trigger(“已选择:已更新”);
});
var value=allBindingsAccessor().value;
value.subscribe(函数(newValue){
$(元素).trigger(“已选择:已更新”);
});
},
更新:函数(元素、valueAccessor、allBindingsAccessor、viewModel){
如果(element.options.length>0){
var chosenOptions=allBindingsAccessor()。已选择;
$(元素)。选择(选择选项);
$(元素).trigger(“已选择:已更新”);
}
}
};
使用绑定所依赖的bindingHandler名称数组创建after属性
ko.bindingHandlers.selected={
init:函数(元素、valueAccessor、allBindingAccessor、,
视图模型,bindigContext){
var options=ko.utils.unwrapObservable(valueAccessor()| |{});
$(元素)。选择(选项);
},
之后:[“选项”]
};
在第二个示例中,在调用setTimeout之前,选项将设置为空对象(并且将保持为空)。触发setTimeout时需要分配它。+1,这使我找到了一个类似问题的解决方案,当您希望自定义绑定在其他绑定之后执行某些操作时,这是一个好模式(但如果您希望它只运行一次,还可以销毁订阅服务器)@user1740381这不正是你想要的吗?我真的以为这会奏效,但我根本无法让它奏效。之后:[选项]似乎不起作用。。。after数组中有什么?据我所知,文档中也没有提到……这里是一个例子['options']
是bindingHandler名称的列表,它将检查当前数据绑定是否包含这些名称,并将延迟到绑定这些名称之后。你是对的,它不在文档中,我在源代码中找到了它。它用于。
ko.bindingHandlers.chosen = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var options = allBindingsAccessor().options;
options.subscribe(function (newValue) {
$(element).chosen();
$(element).trigger("chosen:updated");
});
var value = allBindingsAccessor().value;
value.subscribe(function (newValue) {
$(element).trigger("chosen:updated");
});
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
if (element.options.length > 0) {
$(element).chosen();
$(element).trigger("chosen:updated");
}
}
<select data-bind="options : arrayOfOptions, optionsText: 'Name',
optionsValue: 'Name', chosen: { 'disable_search': true }">
</select>
ko.bindingHandlers.chosen = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var options = allBindingsAccessor().options;
var chosenOptions = allBindingsAccessor().chosen;
options.subscribe(function (newValue) {
$(element).chosen(chosenOptions);
$(element).trigger("chosen:updated");
});
var value = allBindingsAccessor().value;
value.subscribe(function (newValue) {
$(element).trigger("chosen:updated");
});
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
if (element.options.length > 0) {
var chosenOptions = allBindingsAccessor().chosen;
$(element).chosen(chosenOptions);
$(element).trigger("chosen:updated");
}
}
};