Я вижу здесь ряд проблем.
- у вас есть метод обратного вызова ngInit, вызываемый внутри подписки на HTTP-запрос к данным POST. это либо копия и прошлая ошибка, либо вам действительно нужно убрать это из подписки.
- Как правило, angular не рекомендует напрямую манипулировать DOM, как это делает ваш код.
из того, что я могу сказать,
- вы манипулируете DOM, чтобы иметь возможность иметь динамические c формы, которые реагируют на события использования
- тогда вы пытаетесь получить доступ к этим клонированным элементам в классе
Причина, по которой ваши клонированные формы никогда не будут доступны в классе, заключается в том, что вы напрямую манипулируете DOM вместо создания объектов в классе .
т.е. клонирование элемента DOM формы НЕ сделает его доступным для использования в классе.
вы можете получить пользу от прохождения формы Dynami c формы на angular .io, если вы еще этого не сделали.
Я бы предложил либо вложить FormGroups, либо использовать FormArray. используя nestedFormGroups в качестве примера, вы могли бы сделать что-то вроде
constructor(
public fb: FormBuilder,
private http: HttpClient,
private router: Router
) {
this.annexForm = this.fb.group( {
vendor1: this.fb.group(this.getVendorFormFields() ),
vendor1: this.fb.group(this.getVendorFormFields() )
});
}
getVendorFormFields() {
return {
debtor_name: ["", Validators.required],
debtor_contact_person: ["", Validators.required],
debtor_function: ["", Validators.required],
debtor_address: ["", Validators.required],
debtor_email: ["", [Validators.required, Validators.email]],
debtor_phone_number: ["", Validators.required],
debtor_proposed_limit: ["", Validators.required],
debtor_invoice_term: ["", Validators.required],
debtor_projected_turnover: ["", Validators.required],
debtor_ledger: [null, Validators.required],
client: Number,
};
}
, это позволяет вам сохранять определенные c formGroups для каждого поставщика и позволяет изолировать проверку в шаблоне HTML (если это это то, что вам нужно).
альтернативным подходом, который может упростить управление, было бы создание VendorForm
Component. в этом компоненте имейте форму и любую требуемую проверку. это позволит вам отделить logi c, которые получают / устанавливают данные из формы. этот тип разделения значительно упростит управление вашим кодом и позволит вам более легко управлять добавлением / удалением поставщиков и иметь одинаковые элементы управления вводом формы для каждого.
в отдельной заметке, вы можете сэкономить немного кода используя form.getRawValue()
в форме. это будет эффективно делать то же самое, что вы делаете со всеми вашими .appendData
методами. он принимает форму и возвращает объект JSON, содержащий пары имя / значение. затем вы можете передать это в свой HTTP-запрос.
короткая версия, я думаю, здесь заключается в том, что вы пытаетесь что-то «обойти» angular, чтобы получить то, что вы хотите. Я бы посоветовал следовать примерам форм Dynami c, предоставленным angular. не должно быть никаких причин манипулировать DOM, как вы сейчас делаете.
Надеюсь, что-то из этого поможет. удачи