В моей модели у меня есть массив объектов с наблюдаемыми элементами. У меня есть подписка на один из этих элементов (выпадающий список), чтобы заполнить следующий раскрывающийся список (каскадные выпадающие списки). Теперь мне нужно получить описание выбранного значения в этих выпадающих меню. Как бы я вытащил это значение из выпадающего списка? Я стараюсь избегать запуска запроса на сервере, если это возможно.Как определить, какой элемент DOM соответствует элементам наблюдаемого массива Knockout?
В прошлом я сделал self.deptName($('#AssignedDepartment option:selected').text());
, но теперь это выпадающее меню не уникально. У меня было бы много выбора. Я использую uniqueName: true
в каждом из полей. Как в пределах подписки я могу определить, какая выпадающая группа изменилась?
Вот то, что мой подписываться выглядит как:
// Build the hours types when the request type is selected
self.RequestType.subscribe(function (newValue) {
FindRequestType(newValue, function (record) {
// Do stuff
});
});
Вот HTML для выпадающего списка:
<select class="required span12" data-bind="leaveTypeDropDown: RequestType, uniqueName: true"></select>
Вот bindingHandler:
ko.bindingHandlers.leaveTypeDropDown = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
// If we don't have the leave request dropdown data, pull it.
if (jsonRequestType === "") {
$.ajax({
'async': false,
'url': '/api/payroll/LeaveRequestTypes/',
'dataType': 'text json',
'type': 'GET',
'success': function (json) {
jsonRequestType = json;
jsonRequestTypeRecieved = true;
}
});
}
// Fill the drop down list.
LoadRequestType(element);
// register event handler where bound observable will be changed
ko.utils.registerEventHandler(element, 'change', function() {
var observable = valueAccessor();
observable(element.value);
});
// Select the value from the previous record if there is one.
if (selectedRequestType !== null) {
element.value = selectedRequestType;
ko.utils.triggerEvent(element, 'change');
selectedRequestType = null;
}
}
};
Update 1: Потому что есть путаница. Если я выберу значение «VAC» с текстом «Отпуск» в раскрывающемся списке. Как получить текст «Отпуск» в моей модели?
Обновление 2: Вот jsFiddle с моим (главным образом) рабочим кодом, указанным выше. http://jsfiddle.net/MikeWills/cykuqxto/6/ По какой-то причине при загрузке мои капли не работают, но добавьте еще один день, и вы увидите мои рабочие выпадающие списки.
Это зависит от того, как вы связываете выпадающий список с нокаутом. Ваш self.RequestType будет получать контекст и значение, переданное подписке. Если вы обновите свой пример кода, чтобы показать свой HTML, было бы легче помочь. Упреждающе, я бы предположил, что вы должны это проверить, если вы этого не сделали: http://knockoutjs.com/documentation/options-binding.html – Milimetric
@Milimetric добавил, что HMTL –
Вы пишете вопрос «Как в пределах подписаться, я определяю, какой выпадающий список изменился? " и я бы сказал, что с мышлением MVVM вы не должны. Модели представления должны иметь данные, представление представляет собой пользовательский интерфейс для моделей view. Представление знает о viewmodel, viewmodel не должен знать вид. Вы также спрашиваете: «Как я могу вытащить это значение [description] из выпадающего списка?» и ответ будет заключаться в том, что вы вытаскиваете его из viewmodel, а не в раскрывающийся список. Но я предполагаю, что я просто не понимаю, о чем вы действительно спрашиваете. Не могли бы вы прояснить свой вопрос? –