javascript - knockout 中的自定义下拉列表

标签 javascript jquery knockout.js knockout-2.0 knockout-mvc

我正在尝试创建一种自定义下拉列表,它将有一个方法名称,从中获取其所有元素,并且在 knockout 模型绑定(bind)之前,它应该等待从给定的方法填充列表,然后启动其默认行为。

到目前为止,我成功地从给定方法填充了数据。但问题是我如何告诉 knockout 绑定(bind)等待我的 init 方法完成其异步工作。

ko.bindingHandlers.serviceMethod = {
        init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
        var serviceName, optionsValue, optionsText, value, optionsCaption, isCompleted;

        if (element.nodeName == 'SELECT') {                
            optionsValue = allBindings().optionsValue || 'value';
            optionsText = allBindings().optionsText || 'text';                
            serviceName = valueAccessor();               

            var l = $(element);
            serviceName.apply().done(function (results) {
                l.empty();
                $.each(results.List, function (j, result) {
                    l.append($("<option />").val(result[optionsValue] || '').text(result[optionsText] || ''));
                })                    
            });
        }
    },
    update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {

        //what to do now in order to let knockout wait for list to be populated
    }
 }

我的绑定(bind)是

<select name="state" data-bind="serviceMethod:registrationService.getAllStates,value: model.state" id="ddlState"></select>

最佳答案

您可以禁用输入元素,直到数据可用为止,Extender可以做到这一点。

标记:

<select data-bind="serviceMethod:getOptions, options: options, enable:options.enable></select>

View 模型:

function viewModel(){
    this.options=ko.observableArray().extend( { enabled:false});       
}

绑定(bind)处理程序:

ko.bindingHandlers.serviceMethod = {
     init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
        var getOptionsFunction=valueAccessor();
        // deferred implemented as a callback
        getOptionsFunction(function(r){
           allBindings().options(r);               
           // call extender observable to enable the input
           allBindings().options.enabled(true); 
        } );
    },
    update:function (element, valueAccessor, allBindings, viewModel, bindingContext) {
    }    

扩展器:

ko.extenders.enabled = function(target, option) {
    target.enabled=ko.observable(option);
    return target;
};

fiddle

注意:我会将逻辑移至 View 模型,在我们的项目中,我们犯了错误,在应该转到 viewModel 的绑定(bind)处理程序中放置了太多代码。

关于javascript - knockout 中的自定义下拉列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23231540/

相关文章:

javascript - 在 AngularJS 中立即启动 $interval

javascript - 如何防止谷歌广告显示控制台消息或 Uncaught Error

jquery - .hide() 有效,但随后显示以前的动画?

javascript - jquery ui datepicker 不更新值

css - knockout css 数据绑定(bind)不应用类

architecture - KnockoutJS 是否为构建大型 Web 应用程序提供了合适的架构?

javascript - 如何清除/删除 Knockout.js 中的可观察绑定(bind)?

javascript - setTimeout 只运行一次?

javascript - 如何实现 *object* 以改进我的时钟示例 javascript 程序

javascript - jQuery UI Datepicker 天数差异