这不起作用(调用自定义绑定但下拉列表为空)
<select id="parentArea" class="chosen-select" data-bind="
chosen:{},
options: parentAreas,
optionsCaption: 'Choose...',
optionsText: 'Label',
value: selectedParentArea">
</select>
但这有效(下拉列表已填充)
<select id="parentArea" class="chosen-select" data-bind="
options: parentAreas,
optionsCaption: 'Choose...',
optionsText: 'Label',
value: selectedParentArea">
</select>
我想在下拉列表中添加自定义绑定,但不知道该怎么做。
自定义绑定很简单
ko.bindingHandlers.chosen = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
console.log('chosen', element);
$(element).chosen({});
}
};
更新
.chosen({});
是来自另一段 Javascript (harvesthq.github.io/chosen) 的方法。
我意识到,当它被注释掉时,剩下的绑定工作。我真正需要的是运行“$(element).chosen ({});” 在所有其他装订完成之后。
更新 2
当我在应用所有绑定后手动应用“选择”时,它运行良好。例如我可以使用一个运行这个 JS 的按钮
function run() {
$('.chosen-select').chosen({});
};
我只需要在所有绑定完成后自动执行(回调函数?)。我不知道怎么做。
更新 3
“parentAreas”不是静态数组。它是从 Web 服务加载的:
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="chosen:{}
更新 5 避免多次初始化(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;
}
});
}
};
更新 6
我已经编写了通用解决方案(请参阅下面的答案)