Angular ngForm 未定义

Angular ngForm giving undefined

我试图使用 ngOnInit 获取值并将表单初始化为默认值,但表单未定义。我也尝试使用 patchValue 但它不起作用,因为表单未定义。类似的代码在另一个组件中工作,但由于某种原因,这里的表单未定义。我对 angular 比较陌生,所以详细的解释会很有帮助。 这是我的打字稿代码:

export class RecipeEditComponent implements OnInit {
  @ViewChild("recipeForm",{static: false}) recipeForm: NgForm;

  id: number;
  recipe: Recipe;
  editMode = false;

  constructor(
    private route: ActivatedRoute,
    private recipeService: RecipeService
  ) {}

  ngOnInit() {
    this.route.params.subscribe((params: Params) => {
      this.id = +params["id"];
      this.recipe = this.recipeService.getRecipe(this.id);
      this.editMode = params['id'] != null;
      this.initForm()
    });
  }

  initForm(){
    if(this.editMode){
      // this.recipeForm.setValue({
      //   name: "abc",
      //   imagePath: "abc",
      //   description: "abc"
      // })
      console.log(this.recipeForm)
    }
  }
 updateRecipeInfo(form: NgForm) {
    // const newRecipe= new Recipe(values.name, values.imagePath, values.description, this.recipe.ingredients)
    // this.recipeService.updateRecipe(this.id, this.recipe)
    console.log(form)
  }
    
    }

这是我的 html 代码:

<form (ngSubmit)="updateRecipeInfo(recipeForm)" #recipeForm="ngForm">
    <div class="form-group">
      <label for="name">Name</label>
      <input
        id="name"
        class="form-control"
        name="name"
        ngModel
        required
      />
    </div>
    <div>
      <label for="imagePath">Image URL</label>
      <input
        id="imagePath"
        class="form-control"
        name="imagePath"
        ngModel
        required
      />
    </div>
    <div>
      <label for="description">Description</label>
      <textarea
        id="description"
        class="form-control"
        required
        name="description"
        ngModel
        required
      ></textarea>
    </div>
    <div class="align-right-row">
      <button type="submit" class="btn btn-info">Save</button>
      <button type="button" class="btn btn-secondary">Cancel</button>
    </div>
  </form>

尝试将 setValue 包裹在 setTimeout 中,如下所示。

initForm(){
    if(this.editMode){
        setTimeout(() => {
            this.recipeForm.setValue({
                name: "abc",
                imagePath: "abc",
                description: "abc"
            })
            console.log(this.recipeForm);
        }, 0);
    }
}

这将强制表单进入上下文,然后您可以使用初始值设置值。

提交表单应该会显示您在更改后输入到表单中的值。

在这里,您从 ngOnInit 调用 recipeForm 的 setValue,但使用选项 {static: false} 作为 @ViewChild 参考。使用 {static: false} 引用的 @ViewChild 元素只能在 AfterViewInit 之后引用。这可能有帮助:

如果它不适用于 ngInInit(),则在 ngAfterviewInit() 方法中像这样使用它。

试试这个

` @ViewChild('yourForm', { static: false }) yourForm: NgForm;

@ViewChildren('yourForm') yourForm: NgForm; `

ngAfterviewInit() {
  console.log(this.yourForm)

}

这会给你 ngForm,你可以像 valuchanges 一样玩弄它等等。