powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Обновление полей Select при программном изменении другого поля Select
13 сообщений из 13, страница 1 из 1
Обновление полей Select при программном изменении другого поля Select
    #40081282
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Есть страница .cshtml, на которой прописаны несколько полей Select:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
@model voteCollector.Models.Friend
 
@{
    ViewData["Title"] = "Create";
}
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@functions {
    public string GetAntiXsrfRequestToken()
    {
        return Xsrf.GetAndStoreTokens(Context).RequestToken;
    }
}
 
<hr />
<div class="row">
    <input type="hidden" id="RequestVerificationToken"
           name="RequestVerificationToken" value="@GetAntiXsrfRequestToken()">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
           <div class="form-row">
                <div class="form-group col-md-6">
                    <label asp-for="CityId" class="control-label"></label>
                    <select id="CityId" asp-for="CityId" class="form-control" asp-items="ViewBag.CityId"></select>
                </div>
                <div class="form-group col-md-6">
                    <label asp-for="StreetId" class="control-label"></label>
                    <select id="StreetId" asp-for="StreetId" class="form-control" asp-items="ViewBag.StreetId"></select>
                </div>
                <div id="divHouse" class="form-group col-md-6">
                    <label asp-for="HouseId" class="control-label"></label>
                    <select id="HouseId" asp-for="HouseId" class="form-control" asp-items="ViewBag.HouseId" style="width:100%"></select>
                </div>
<div class="form-row">
                <div class="form-group col-md-6">
                    <input type="submit" value="Добавить" class="btn btn-primary btn-block" />
                </div>
                <div class="form-group col-md-6">
                    <a asp-action="Index" class="btn btn-secondary btn-block"><i class="fa fa-table"></i>Вернуться к списку</a>
                </div>
            </div>
        </form>
    </div>
</div>
 
<environment include="Development">
    <script src="~/lib/jquery/dist/jquery.min.js"></script>
</environment>
 
@section Scripts {
 
    <script type="text/javascript" src="~/js/JS_Create_Friend.js"></script>
 
 
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
 
    @{
        if (TempData["msg"] != null)
        {
            <script>
            alert('@TempData["msg"]')
            </script>
        }
    }
}



Поле "HouseId" зависит от "StreetId", а "StreetId" зависит от "CityId". Для их динамического обновления были написаны функции с ajax-запросами к серверу:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
// Обновление списка улиц после выбора города
$(function () {
    $("#CityId").change(function () {
        var formData = { 'CityId': Number.parseInt($('#CityId').val()), 'Name': $('#CityId>option:selected').text() };
        $.ajax({
            url: "http://localhost:18246/api/API/searchStreets",
            headers:
            {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'RequestVerificationToken': $('#RequestVerificationToken').val()
            },
            type: 'POST',
            dataType: "json",
            data: JSON.stringify(formData),
            success: function (data) {
 
                dataFilling(data, 'idStreet', 'name', '#StreetId', '<option/>');
            },
            error: function (result, status, er) {
                alert("error: " + result + " status: " + status + " er:" + er);
            }
        });
    });
});
// Обновление списка домов после выбора улицы
$(function () {
    $("#StreetId").change(function () {
        var formData = { 'IdStreet': Number.parseInt($('#StreetId').val()), 'Name': $('#StreetId>option:selected').text() };
        $.ajax({
            url: "http://localhost:18246/api/API/searchHouse",
            headers:
            {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'RequestVerificationToken': $('#RequestVerificationToken').val()
            },
            type: 'POST',
            dataType: "json",
            data: JSON.stringify(formData),
            success: function (data) {
 
                dataFilling(data, 'idHouse', 'name', '#HouseId', '<option/>');
            },
            error: function (result, status, er) {
                alert("error: " + result + " status: " + status + " er:" + er);
            }
        });
    });
});
//Заполнение объекта html данными из json массива
function dataFilling(data, nameProperty1, nameProperty2, idObject, propertyHtml) {
 
    var objectHtml = $(idObject);
    objectHtml.empty();
 
    $.each(data, function (index, dataInstance) {
        objectHtml.append($(propertyHtml,
            {
                value: dataInstance[nameProperty1],
                text: dataInstance[nameProperty2]
            }));
    });
}


Если значения Select меняется интерактивно (пользователем), то все вроде работает нормально, но если значения Select меняется программно, то значение Select не обновляется. Пример:
Пользователь выбрал город, значение Select поменялось программно - загрузился новый список улиц, 1 ой улицей установилось какое-то значение, тут после обновления улиц должен бы обновиться и список домов, но он не обновляется.

Как можно исправить, чтобы список домов обновлялся после программного обновления списка улиц?
...
Рейтинг: 0 / 0
Обновление полей Select при программном изменении другого поля Select
    #40081319
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir , у тебя все подгрузки навешаны на события...
Когда ты программой меняешь значения, события не генерятся, подгрузки не происходит.

Остается два путя:
- запускать подгрузки самостоятельно
- таки генерить нужные события на нужных элементах

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<form>
	<input type='text' />
</form>

<script>
elem = document.querySelector('input')
elem.onchange = function() {
  alert('Поле изменено')
}
setTimeout(() => {
	elem.value = 'Пример текста'
	var event = new Event("change")
	elem.dispatchEvent(event)
}, 1000)
</script>
...
Рейтинг: 0 / 0
Обновление полей Select при программном изменении другого поля Select
    #40081320
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa, это мне нужно прописать в функции, которая срабатывает при изменении поля 'CityId', самую первую?
Как правильно, чтобы событие генерировалось только когда программно меняется значение поле?
...
Рейтинг: 0 / 0
Обновление полей Select при программном изменении другого поля Select
    #40081340
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir , я особо такие длинные тексты не смотрю... Мне и своих хватает.
В своем примере я показал что нужно делать после изменение значения поля
Код: javascript
1.
2.
3.
elem.value = 'Пример текста'
var event = new Event("change")
elem.dispatchEvent(event)


Это:
- создать нужное событие (по которому у тебя идет подгрузка данных)
- вызвать его на нужном элементе (смотри на какой элемент у тебя вешается то событие по которому идет подгрузка)

Более конкретно рассматривать чужие коды, бесплатно, нет никакого желания... Т.ч. извини.
...
Рейтинг: 0 / 0
Обновление полей Select при программном изменении другого поля Select
    #40081355
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir , вот тебе пример еще для селектов...

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
<form onsubmit='return false;'>
	<select id='test'>
		<option></option>
		<option value='1'>Первый</option>
		<option value='2'>Второй</option>
	</select>
	

	<select id='data'>
	</select>
	<hr />
	<button>Программно</button>
</form>

<script>
const data = [
	[
		{value: '', title: ''},
		{value: '1 1', title: 'Для первого 1'},
		{value: '1 2', title: 'Для первого 2'}
	],
	[
		{value: '', title: ''},
		{value: '2 1', title: 'Для второго 1'},
		{value: '2 2', title: 'Для второго 2'}
	],
]
let elem = document.querySelector('#test')
elem.addEventListener('change', function(e) {
	const el = document.querySelector('#data')
	while (el.firstChild) el.removeChild(el.firstChild)
	const a = data[this.value - 1]
	for (let i = 0; i < a.length; i++) {
		let o = document.createElement('option')
		o.value = a[i].value
		o.innerHTML = a[i].title
		el.appendChild(o)
	}
})
elem = document.querySelector('button')
elem.addEventListener('click', function(e) {
	const elem = document.querySelector('#test')
	elem.selectedIndex = 1
	const event = new Event("change")
	elem.dispatchEvent(event)
})
</script>
...
Рейтинг: 0 / 0
Обновление полей Select при программном изменении другого поля Select
    #40081414
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa, да, понял, спасибо! Буду пробывать.
...
Рейтинг: 0 / 0
Обновление полей Select при программном изменении другого поля Select
    #40081419
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,
сгенерированное событие отрабатывает, функция срабатывает, но отправляет старые данные на сервер, те что были до обновления.
Как это исправить?

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
// Обновление списка улиц после выбора города
$(function () {
    $("#CityId").change(function () {
        var formData = { 'CityId': Number.parseInt($('#CityId').val()), 'Name': $('#CityId>option:selected').text() };
        $.ajax({
            url: "http://localhost:18246/api/API/searchStreets",
            headers:
            {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'RequestVerificationToken': $('#RequestVerificationToken').val()
            },
            type: 'POST',
            dataType: "json",
            data: JSON.stringify(formData),
            success: function (data) {

                dataFilling(data, 'idStreet', 'name', '#StreetId', '<option/>');
            },
            error: function (result, status, er) {
                alert("error: " + result + " status: " + status + " er:" + er);
            }
        });

        // Генерация события для элемента Select
        let elemSelectHouse = document.querySelector('#StreetId')
        elemSelectHouse.selectedIndex = 0;
        const event = new Event("change");
        elemSelectHouse.dispatchEvent(event);
    });
});


// Обновление списка домов после выбора улицы
$(function () {
    $("#StreetId").change(function () {
        var formData = { 'IdStreet': Number.parseInt($('#StreetId').val()), 'Name': $('#StreetId>option:selected').text() };
        $.ajax({
            url: "http://localhost:18246/api/API/searchHouse",
            headers:
            {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'RequestVerificationToken': $('#RequestVerificationToken').val()
            },
            type: 'POST',
            dataType: "json",
            data: JSON.stringify(formData),
            success: function (data) {

                dataFilling(data, 'idHouse', 'name', '#HouseId', '<option/>');
            },
            error: function (result, status, er) {
                alert("error: " + result + " status: " + status + " er:" + er);
            }
        });
    });
});
...
Рейтинг: 0 / 0
Обновление полей Select при программном изменении другого поля Select
    #40081459
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir
но отправляет старые данные на сервер, те что были до обновления.
Как это исправить?

Так ты вроде там из полей читаешь...

В моем примере с селектами данные прочитываются те, что я записал в поле.
...
Рейтинг: 0 / 0
Обновление полей Select при программном изменении другого поля Select
    #40081469
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa
Vlad__i__mir
но отправляет старые данные на сервер, те что были до обновления.
Как это исправить?

Так ты вроде там из полей читаешь...

В моем примере с селектами данные прочитываются те, что я записал в поле.


Значения в поля у меня приходят с сервера, и когда генерируется событие и срабатывает обработчик, такое ощущение, что они ещё не успевают прийти с сервера и обновиться в select
...
Рейтинг: 0 / 0
Обновление полей Select при программном изменении другого поля Select
    #40081486
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir , асинхронность она такая...
...
Рейтинг: 0 / 0
Обновление полей Select при программном изменении другого поля Select
    #40081487
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa
Vlad__i__mir , асинхронность она такая...


Это я понял. Как прописать, чтобы он дожидался ответа с сервера, а потом уже генерировал событие?
...
Рейтинг: 0 / 0
Обновление полей Select при программном изменении другого поля Select
    #40081488
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir , обычно такие действия делаются после получения данных и обработки ответа,
т.е. в конце самого последнего колбека

Код: javascript
1.
success: function (data) {}
...
Рейтинг: 0 / 0
Обновление полей Select при программном изменении другого поля Select
    #40081592
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa
Vlad__i__mir , обычно такие действия делаются после получения данных и обработки ответа,
т.е. в конце самого последнего колбека

Код: javascript
1.
success: function (data) {}



Спасибо! Это сработало, все работает как надо
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Обновление полей Select при программном изменении другого поля Select
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]