Knockout - czy możliwe jest połączenie standardowych wiązań do wyboru z niestandardowym wiązaniem?

To NIE działa (wywoływane jest niestandardowe powiązanie, ale lista rozwijana jest pusta)

<select id="parentArea" class="chosen-select" data-bind="
   chosen:{},
   options: parentAreas,
   optionsCaption: 'Choose...',
   optionsText: 'Label',
   value: selectedParentArea">
</select>

Ale to działa (lista rozwijana jest wypełniona)

<select id="parentArea" class="chosen-select" data-bind="
   options: parentAreas,
   optionsCaption: 'Choose...',
   optionsText: 'Label',
   value: selectedParentArea">
</select>

Chciałbym dodać niestandardowe powiązanie do listy rozwijanej, ale nie wiem, jak to zrobić.

Niestandardowe wiązanie jest proste

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

AKTUALIZACJA

.wybrany({});

to metoda z innego fragmentu Javascript (harvesthq.github.io/chosen).

Uświadomiłem sobie, że kiedy jest komentowane, pozostałe wiążące prace. Naprawdę potrzebuję uruchomić „$ (element) .chosen ({});” PO wszystkich innych wykończeniach oprawy.

AKTUALIZACJA 2

Po ręcznym zastosowaniu „wybranego” po zastosowaniu wszystkich powiązań działa dobrze. Np. Mogę użyć przycisku, który uruchamia ten JS

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

Po prostu muszę to zrobić automatycznie (funkcja wywołania zwrotnego?), Gdy wszystkie powiązania są zakończone. Nie wiem jak to zrobić.

AKTUALIZACJA 3

„parentAreas” nie jest tablicą statyczną. Jest ładowany z usługi internetowej:

function ViewModel() {

    var self = this;

   self.init = function () {

        //load parent areas from web service
    };

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

ko.applyBindings( new ViewModel());

Chcę zainicjować niestandardowe wiązanie „wybrane”, gdy obszary nadrzędne są gotowe.

AKTUALIZACJA 4

Nowa wersja (działa, ale nie nadaje się do ponownego użycia, ponieważ ma zakodowane powiązania)

ko.bindingHandlers.chosen = {funkcja init: (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({});
            }
        });
    }
};

// i powiązanie to tylko powiązanie danych = "wybrane: {}

AKTUALIZACJA 5 Unikanie wielokrotnej inicjalizacji (hacky way)

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

AKTUALIZACJA 6

Napisałem ogólne rozwiązanie (zobacz moją odpowiedź poniżej)

questionAnswers(4)

yourAnswerToTheQuestion