這不工作(自定義綁定的調用,但下拉列表是空的)Knockout - 是否可以將標準選擇綁定與自定義綁定結合起來?
<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({});
}
};
UPDATE
.chosen({});
是另一塊Javascript的方法(harvesthq.github.io/chosen)。
我意識到當它被註釋掉時,剩下的綁定工作。 我真正需要的是運行「$(element).chosen({});」完成所有其他約束後。
UPDATE 2
當我申請「選擇」應用了所有綁定後手動,它工作得很好。例如,我可以用它運行這個JS
function run() {
$('.chosen-select').chosen({});
};
我只需要自動做一個按鈕(一個回調函數?)當所有綁定完成。 我不知道該怎麼做。
UPDATE 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());
我想初始化「選擇」框自定義綁定時父區域準備就緒。
UPDATE 4
新版本(的作品,但不可重複使用的,因爲它已經硬編碼綁定)
ko.bindingHandlers。選擇= { INIT:功能(元件,valueAccessor,allBindingsAccessor,視圖模型,上下文){
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({});
}
});
}
};
//和結合僅僅是數據綁定=「選自:{}
UPDATE 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;
}
});
}
};
UPDATE 6
我已經寫了通用的解決方案(見我的回答如下)
是什麼$(元素)。 **選擇**({}); –
好問題。 「.chosen({});」是另一塊Javascript的一種方法(http://harvesthq.github.io/chosen/)。我意識到當它被註釋掉時,剩下的約束性工作。我需要的是運行「$(element)。selected({});」完成所有其他約束後。 –
雖然 – Anders