Выключить выпадающий элемент выпадающего списка
В настоящее время я могу включить/отключить весь снимок, используя привязку enable в нокауте.
Когда Enable = false, весь снимок больше не доступен для кликов, и пользователь не может видеть другие возможные значения в раскрывающемся списке.
<select data-bind="options: OptionsList, optionsText: 'Key', optionsValue: 'Value', value: FieldValue, enable: Enable"></select>
что получилось:
<select disabled=""></select>
То, что я надеюсь сделать, это сделать что-то вроде этого
<select>
<option disabled="disabled" value='1'>One </option>
<option selected="select" value='2'>Two </option>
<option disabled="disabled" value='3'>Three </option>
</select>
Таким образом, я все еще вижу свои параметры, но все они отключены, поэтому пользователь не может их изменить.
Я просмотрел опцииAfterRender в нокауте, но у меня больше нет доступа к выбранному значению. элемент, который передается, является только ключом и значением элемента select, а не наблюдаемым.
Любая помощь будет высоко оценена. Спасибо
Ответы
Ответ 1
Вы можете создать свои элементы option
, используя foreach
, например:
<select data-bind="value: selected, foreach: options">
<option data-bind="attr: { disabled: !enabled(), value: value }, text: name"></option>
</select>
Пример: http://jsfiddle.net/rniemeyer/4PuxQ/
В противном случае, вот пример привязки optionsBind
от Michael Best, который позволит вам привязать параметр без использования foreach (использует optionsAfterRender
):
<select data-bind="value: selected, options: options, optionsText: 'name', optionsValue: 'value', optionsBind: 'attr: { disabled: !enabled() }`"></select>'
Образец: http://jsfiddle.net/rniemeyer/KxY44/
Ответ 2
Вам нужно использовать опцииAfterRender для применения отключенных к параметрам. Он обсуждался в документации: http://knockoutjs.com/documentation/options-binding.html
<select data-bind="options: OptionsList, optionsText: 'Key', optionsValue: 'Value', value: FieldValue, optionsAfterRender: setOptionDisable"></select>
self.setOptionDisable = function(option, item) {
ko.applyBindingsToNode(option, {disable: item.disable}, item);
}
Вот демонстрационная работа: http://jsfiddle.net/vkFUC/
Ответ 3
Вы можете использовать опцииAfterRender для отключения параметров. Вам нужно предоставить еще одно наблюдаемое свойство объекта для включения или отключения опции.
Код: -
//Optionlist will look like this
OptionsList: ko.observableArray([{
Key: 1,
Value: "Jack",
disable: ko.observable(false)
}, {
Key: 2,
Value: "Jhon",
disable: ko.observable(false)
}]),
//Function will be used in optionsAfterRender
setOptionDisable: function (option, item) {
ko.applyBindingsToNode(option, {
disable: item.disable
}, item);
}
Скриншот
Ответ 4
Для версии 3.5.0
, если вы хотите продолжать использовать решение mbest (которое я лично нахожу очень полезным и элегантным), просто замените ko.contextFor
вызовом этого предложенного обходного пути из chrisknoll:
function contextForNodeOrNearestParent(node) {
// Proposed fix for 3.5.0 ko.contextFor https://github.com/knockout/knockout/pull/2447/files
var context = ko.contextFor(node);
if (!context && node.parentNode) {
return contextForNodeOrNearestParent(node.parentNode);
}
return context;
}
Исходный пользовательский bindingHandler из mbest будет затем изменен следующим образом:
ko.bindingHandlers.optionsBind = {
preprocess: function (value, key, addBinding) {
addBinding('optionsAfterRender', 'function(option, item) { ko.bindingHandlers.optionsBind.applyBindings(option, item, ' + value + ') }');
},
applyBindings: function (option, item, bindings) {
if (item !== undefined) {
option.setAttribute('data-bind', bindings);
//ko.applyBindings(ko.contextFor(option).createChildContext(item), option);
ko.applyBindings(contextForNodeOrNearestParent(option).createChildContext(item), option);
}
}
};
Это работает для моего проекта, как шарм. И я публикую это здесь, на случай, если это может сэкономить кому-то время, и для дальнейшего личного использования.