Фон
У меня есть ситуация, когда я хочу иметь несколько выпадающих меню, которые меняют параметры в зависимости от того, что доступно.Мне удалось упростить этот код и повторить проблему с кодом ниже.
В этом примере у меня есть 5 доступных цветов, и я хочу выбрать четыре из них.Если я выберу одно, то я хочу, чтобы оно не было доступно в других меню.
Задача
Раскрывающиеся меню только вид работы.Показанные параметры кажутся действительными в зависимости от того, что доступно, однако иногда при выборе записи это не разрешается, пока я не выберу второй раз.Кроме того, как видно из приведенного ниже комментария, код lodash _.sortBy
, по-видимому, полностью нарушает функциональность.
HTML
<div data-bind="foreach:colorChoices">
<select data-bind="options: localAvailableOptions, optionsCaption: 'Select...', optionsText: function(currentValue) {return 'Color ID ' + currentValue;}, value: id"></select>
</div>
Javascript
function appModel() {
var self = this;
self.colorIds = [1, 2, 3, 4, 5];
self.colorChoices = ko.observableArray();
self.selectedColorIds = ko.computed(function() {
return _(self.colorChoices())
.filter(function(item) {
return item.id()
})
.map(function(item) {
return item.id()
})
.value();
});
self.availableColorIds = ko.computed(function() {
return _.difference(self.colorIds, self.selectedColorIds());
});
self.colorChoices.push(new colorChoice(self));
self.colorChoices.push(new colorChoice(self));
self.colorChoices.push(new colorChoice(self));
self.colorChoices.push(new colorChoice(self));
}
function colorChoice(parent) {
var self = this;
self.id = ko.observable();
self.localAvailableOptions = ko.computed(function() {
//clone as to not modify original array
var availableIds = _.clone(parent.availableColorIds());
//add own ID so dropdown menu contains matching entry
if (self.id()) {
availableIds.push(self.id());
}
//seems to break with _.sortBy
//return _.sortBy(availableIds);
return availableIds;
});
}
ko.applyBindings(new appModel());
CodePen (тот же код)
https://codepen.io/anon/pen/KEKPKV