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

Есть страница .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
02.07.2021, 10:47
    #40081319
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление полей Select при программном изменении другого поля Select
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
02.07.2021, 10:53
    #40081320
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление полей Select при программном изменении другого поля Select
krvsa, это мне нужно прописать в функции, которая срабатывает при изменении поля 'CityId', самую первую?
Как правильно, чтобы событие генерировалось только когда программно меняется значение поле?
...
Рейтинг: 0 / 0
02.07.2021, 11:55
    #40081340
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление полей Select при программном изменении другого поля Select
Vlad__i__mir , я особо такие длинные тексты не смотрю... Мне и своих хватает.
В своем примере я показал что нужно делать после изменение значения поля
Код: javascript
1.
2.
3.
elem.value = 'Пример текста'
var event = new Event("change")
elem.dispatchEvent(event)


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

Более конкретно рассматривать чужие коды, бесплатно, нет никакого желания... Т.ч. извини.
...
Рейтинг: 0 / 0
02.07.2021, 12:24
    #40081355
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление полей Select при программном изменении другого поля Select
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
02.07.2021, 14:30
    #40081414
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление полей Select при программном изменении другого поля Select
krvsa, да, понял, спасибо! Буду пробывать.
...
Рейтинг: 0 / 0
02.07.2021, 15:02
    #40081419
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление полей Select при программном изменении другого поля Select
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
02.07.2021, 17:26
    #40081459
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление полей Select при программном изменении другого поля Select
Vlad__i__mir
но отправляет старые данные на сервер, те что были до обновления.
Как это исправить?

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

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

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

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


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


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

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

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



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


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