Knockout - возможно ли объединить стандартные привязки выбора с настраиваемой привязкой?

Это НЕ работает (пользовательская привязка вызывается, но выпадающий список пуст)



Но это работает (раскрывающийся список заполнен)



Я хотел бы добавить пользовательскую привязку к выпадающему меню, но не уверен, как это сделать.

Пользовательская привязка проста

ko.bindingHandlers.chosen = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
        console.log('chosen', element);
        $(element).chosen({});
    }
};

ОБНОВИТЬ

.chosen ({});

это метод из другого фрагмента Javascript (crophq.github.io/chosen).

Я понял, что когда это закомментировано, остальные обязательные работы. Что мне действительно нужно, так это бежать$ (element) .chosen ({}); " ПОСЛЕ всех остальных обязательных отделки.

ОБНОВЛЕНИЕ 2

Когда я подаю заявлениевыбрал» вручную после того, как все привязки применены, это работает хорошо. Например, я могу использовать кнопку, которая запускает этот JS

 function run() {
    $('.chosen-select').chosen({});
};    

Мне просто нужно сделать это автоматически (функция обратного вызова?), Когда все привязки завершены. Я не знаю как это сделать.

ОБНОВЛЕНИЕ 3 "

parentAreas» не является статическим массивом Загружается из веб-сервиса:

function ViewModel() {

    var self = this;

   self.init = function () {

        //load parent areas from web service
    };

    self.init(); //Running the init code
}

ko.applyBindings( new ViewModel());

Хочу инициализироватьвыбрал» привязывать пользовательские привязки, когда родительские области готовы.

ОБНОВЛЕНИЕ 4

Новая версия (работает, но не подлежит повторному использованию, поскольку имеет жестко привязанные привязки)

ko.bindingHandlers.chosen = {init: function (element, valueAccessor, allBindingsAccessor, viewModel, context) {

        viewModel.parentAreas.subscribe(function(newParentAreas) {
            if (newParentAreas && newParentAreas.length > 0) {

                ko.applyBindingsToNode(element, {
                    options: viewModel.parentAreas,
                    optionsCaption: 'Choose...',
                    optionsText: 'Label',
                    value: viewModel.selectedParentArea
                });
                $(element).chosen({});
            }
        });
    }
};

// а привязка просто data-bind = "выбраны: {}

ОБНОВЛЕНИЕ 5 Как избежать множественной инициализации (хакерский путь)

ko.bindingHandlers.parentAreaComboBox = {

    initialised: false,
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, context) {

        viewModel.parentAreas.subscribe(function (newParentAreas) {

            if (newParentAreas && newParentAreas.length > 0) {

                if (ko.bindingHandlers.parentAreaComboBox.initialised) {
                    return;
                }
                ko.applyBindingsToNode(element, {
                    options: viewModel.parentAreas,
                    optionsCaption: 'Choose...',
                    optionsText: 'Label',
                    value: viewModel.selectedParentArea
                });
                $(element).chosen({});
                ko.bindingHandlers.parentAreaComboBox.initialised = true;
            }
        });
    }
};

ОБНОВЛЕНИЕ 6I '

Мы написали общее решение (см. мой ответ ниже)

Ответы на вопрос(4)

Ваш ответ на вопрос