Javascript 如何订购淘汰绑定?

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 = {

我正在使用knockout.js。我陷入了一个有点奇怪的境地(很难解释,但我正在努力,如果我不清楚,很抱歉)。我在单个选择列表上使用自定义绑定和选项绑定:

  <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");
        }
    }
};