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 '
Мы написали общее решение (см. мой ответ ниже)