#html #angular #ngmodel
#HTML #угловой #ngmodel
Вопрос:
Каждый раз, когда я пытаюсь отправить данные в ts-файл, ngModel сбрасывает выбор в выпадающем списке.
<select placeholder="select" class="custom-select" id="
{{entity.parameterDisplayName}}"
[(ngModel)]="entity.parameterValue"
name="{{entity.parameterDisplayName}}">
<option [value]="-1" [selected] ="true">Select Registration Type</option>
<option *ngFor="let regTypeValue of registrationTypeList"
[ngValue]="entity.parameterValue" [value]="regTypeValue"
[selected]="regTypeValue">{{ regTypeValue }} </option></select>
Я также пробовал использовать [select] и onClick, однако, поскольку дата переносится успешно, и выбор из выпадающего списка сбрасывается каждый раз, когда я нажимаю на кнопку поиска ниже. Который отправит всю информацию из данных, заполненных из формы.
Поскольку изменения могут быть выполнены и повторен поиск. Выбор в форме должен оставаться на месте. И все данные являются статическими, но выпадающий список сбрасывается сам, пожалуйста, подскажите мне, как остановить его сброс.
Пожалуйста, помогите
Заранее спасибо
Комментарии:
1. что вы делаете внутри функции
postRequestAndFetchResult
и почему вы не передаете всю форму, используяpostRequestAndFetchResult (f)
, а вместо этого просто передаете логическое значение, используяpostRequestAndFetchResult (f.form.valid...)
2. Поскольку функция принимает postRequestAndFetchResult(isValid: логическое значение, moduleName: Строка).
3.
postRequestAndFetchResult
не является встроенной угловой функцией, этот код должен быть написан вами и должен присутствовать в component.ts. Используете ли вы какие-либо другие библиотеки?4. Да, функция была написана моим коллегой, мне нужно отправить значения формы в функцию, которую я могу отправить. Однако проблемы связаны с выпадающим списком.
5. Я обновил свой ответ, пожалуйста, попробуйте и дайте мне знать, если это сработает.
Ответ №1:
Редактировать:
Я полагаю, что в этом и заключается проблема, пожалуйста, обновите код кнопки следующим образом и повторите попытку. Вам нужно указать тип кнопки как «отправить» для кнопки поиска, а также удалить событие щелчка оттуда, потому что это то, для чего (ngSubmit)
оно существует, вы не должны явно привязывать (click)
событие при использовании (ngSubmit)
<button
type="reset"
class="btn btn-secondary pl-4 pr-4 mr-3"
(click)="reset();">
Reset
</button>
<button
type="submit"
class="btn btn-primary pl-4 pr-4"
[disabled]="!searchButtonEnabled"
ng-disabled="loginform.$invalid">
Search
</button>
Перед РЕДАКТИРОВАНИЕМ:
[(ngModel)] не является причиной сброса вашей формы, как вы сказали, вы нажимаете на кнопку, чтобы отправить данные формы:
И выбор из выпадающего списка сбрасывается каждый раз, когда я нажимаю на кнопку поиска ниже. Который отправит всю информацию из данных, заполненных из формы.
Это происходит потому, что кнопка типа «отправить» обновит страницу, то есть поведение HTML, в Angular вы не отправляете такие формы, вам нужно использовать Template Driven Forms
Reactive Forms
подход или и привязать (ngSubmit)
событие к функции.
В приведенном ниже примере #f является локальной ссылкой, и мы переходим ngForm
к локальной ссылке. Эта локальная ссылка передается в onSubmit(f)
функцию, к которой затем можно получить доступ в качестве аргумента в component.ts
файле.
<form #f="ngForm" (ngSubmit)="onSubmit(f)" novalidate>
<input name="first" ngModel required #first="ngModel">
<input name="last" ngModel>
<button>Submit</button>
</form>
Вот официальная документация angular о том, как использовать формы, управляемые шаблоном:
Формы, управляемые шаблоном
Комментарии:
1. Я добавил (ngSubmit)=»onSubmit(f) novalidate, поскольку <form #f=»ngForm» уже был добавлен, однако у меня такая же проблема. Не буквально «onSubmit(f) novalidate , метод, который вызывается, когда я нажимаю на кнопку поиска. Тем не менее проблема сохраняется. !
2. Вам нужно будет показать больше вашего кода, чтобы я мог помочь в выявлении проблемы. Можете ли вы обновить свой вопрос, чтобы включить в него весь
<form> </form>
раздел шаблона иcomponent.ts
файл? Также вы можете удалитьnovalidate
, если хотите, это не имеет никакого отношения кAngular
.novalidate
это синтаксис HTML.3. Кроме того, попробуйте удалить привязку banana из
ngModel
. Вместо того, чтобы писать это так, вместо этого[(ngModel)]
напишите это такngModel
. или используйте привязку свойства, подобную этой[ngModel]
, если это необходимо.4. Я обновил код, однако большая его часть не имеет значения. Пожалуйста, посмотрите и дайте мне знать. Спасибо.
Ответ №2:
Ваша проблема в том, что внутри выбора, который вы используете ngModel
для каждого параметра. Вы должны использовать ngValue
директиву следующим образом:
<form #f="ngForm">
<select name="test" [(ngModel)]="selectValue">
<option [ngValue]="1">1</option>
<option [ngValue]="2">2</option>
<option [ngValue]="3">3</option>
</select>
</form>
вот демонстрация.
ngModel регистрирует элемент управления с помощью элемента формы, и отдельные параметры не являются отдельными элементами управления, поскольку они являются частью элемента управления select .
Таким образом, ваш код должен выглядеть так (кстати, всякий раз, когда вы привязываете атрибуты к отдельным элементам, вы должны использовать [] в пользу синтаксиса интерполяции {{}}, потому что он интерполирует все в строку, а иногда вам нужно иметь число, поэтому мое предложение — использовать {{}} внетеги):
<select [id]="entity.Name" [(ngModel)]="entity?.parameterValue || -1" class="custom-select" [name]="entity.Name">
<option [ngValue]="-1">Select Registration Type</option>
<option *ngFor="let rgValue of rgList"
[ngValue]="rgValue">{{rgValue}}</option>
</select>
При использовании форм, управляемых шаблоном, я до сих пор не нашел случая, когда мне понадобилась бы «двусторонняя привязка данных». Он ngModel
содержит значение для каждого элемента управления формой внутри, поэтому, на мой взгляд, нехорошо управлять информацией в двух местах. Вы можете просто использовать [ngModel]
без ()
привязки значения к элементу управления, а затем всякий раз, когда вы отправляете, вы можете получить значение из ссылки на форму, которую f
содержит переменная шаблона (в примере, который я показал #f =»ngModel»)
<form #f="ngForm" (ngSubmit)="submitHandler(f.value)">
<select [id]="entity.Name" [ngModel]="entity?.parameterValue || -1" class="custom-select" [name]="entity.Name">
<option [ngValue]="-1">Select Registration Type</option>
<option *ngFor="let rgValue of rgList"
[ngValue]="rgValue">{{rgValue}}</option>
</select>
</form>
Комментарии:
1. Я пытался использовать значение ngValue, однако использование значения не переносит выбор, сделанный из выпадающего списка, я загрузил полный код, не могли бы вы взглянуть. Спасибо
2. @Mr.R0bot Я только что проверил демонстрационную версию, которую я предоставил, и все работает так, как должно. Я не уверен, как это не работает на вашей стороне. В коде, который вы показали, вы должны удалить все и просто оставить
ngValue
. Вы не должны использовать атрибутыselected
илиvalue
. Кстати, я только что увидел, что допустил ошибку. У вас должно быть `[ngValue]=»rgValue»`. Взгляните на код в моем ответе (я его обновил)
Ответ №3:
Попробуйте одностороннюю привязку ngModel.
[ngModel]="entity.parameterValue"