Итак, у меня есть Select, у которого есть свои параметры из вычисленного. Я хочу выбирать значение по умолчанию каждый раз, когда меняются параметры выбора.
Я пробовал несколько разных способов сделать это:
подписаться на список - вызывается до того, как список вернется, поэтому изменяет значение наблюдаемого в порядке, но он не отображается правильно, потому что список изменяется ПОСЛЕ.
afterRender — не работает с этим типом привязки.
- OptionsafterRender - работает, как и в скрипте ниже, ОДНАКО он вызывается для каждого отдельного элемента, а не только один раз для всего рендеринга, поэтому мне кажется, что это неправильный способ сделать это.
var rawData = [{
Type: "1",
Color: "Blue",
Name: "Blue Car"
}, {
Type: "2",
Color: "Blue",
Name: "Blue House"
}, {
Type: "1",
Color: "Red",
Name: "Red Car"
}, {
Type: "2",
Color: "Red",
Name: "Red House"
}];
var viewModel = {
FirstSelectedOption: ko.observable(),
SecondSelectOptions: null,
SecondSelectedOption: ko.observable(),
Load: function() {
var self = viewModel;
self.SecondSelectOptions = ko.computed(function() {
var selected = self.FirstSelectedOption();
var returnValue = new Array({
Type: "*",
Color: "All",
Name: "All"
});
var filteredlist = ko.utils.arrayFilter(rawData, function(item) {
return item.Type == selected;
});
returnValue = returnValue.concat(filteredlist);
return returnValue;
}, self);
self.SecondSelectedOption.SetDefault = function() {
// we want the default to always be blue instead 'all', blue might not be the last option
var self = viewModel;
var defaultoption = ko.utils.arrayFirst(self.SecondSelectOptions(), function(item) {
return item.Color == "Blue";
});
self.SecondSelectedOption(defaultoption);
};
}
};
viewModel.Load();
ko.applyBindings(viewModel);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<select data-bind="value: FirstSelectedOption">
<option value="1">Car</option>
<option value="2">House</option>
</select>
<br/>
<select data-bind="options: SecondSelectOptions,
optionsText: 'Name',
value: SecondSelectedOption,
optionsAfterRender: SecondSelectedOption.SetDefault"></select>
Единственный способ, который приходит мне на ум, — это пользовательская привязка... и я даже не уверен, что это действительно возможно без повторной реализации всей привязки параметров.
Я не могу быть первым, кто захочет это, есть ли лучшая практика/способ, который мне не хватает?