これは機能しません (カスタム バインディングが呼び出されますが、ドロップダウンは空です)
<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
すべてのバインディングが適用された後に「chosen」を手動で適用すると、うまく機能します。たとえば、この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: 関数 (要素、valueAccessor、allBindingsAccessor、viewModel、コンテキスト) {
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 複数の初期化を回避する (ハッキーな方法)
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
私は一般的な解決策を書きました(以下の私の答えを見てください)