当前位置: 首页 > 知识库问答 >
问题:

如何修复“无法读取未定义的属性'title'”

章睿
2023-03-14

我正在学习Mosh Hamedani的教程“角度4:初学者到专业”。

当我试图编辑一个产品时,我试图在一个表单中显示它的标题。该产品存储在firebase数据库中。我是新来的Angular。

但是,当我转到编辑表单时,控制台中会出现此错误

ERROR TypeError: Cannot read property 'title' of undefined
    at Object.eval [as updateDirectives] (ProductFormComponent.html:7)
    at Object.debugUpdateDirectives [as updateDirectives] (core.js:23911)
    at checkAndUpdateView (core.js:23307)
    at callViewAction (core.js:23548)
    at execComponentViewsAction (core.js:23490)
    at checkAndUpdateView (core.js:23313)
    at callViewAction (core.js:23548)
    at execEmbeddedViewsAction (core.js:23511)
    at checkAndUpdateView (core.js:23308)
    at callViewAction (core.js:23548)

这是我表格的一部分:

<div class="form-group">
            <label for="title">Title</label>
            <input #title="ngModel" [(ngModel)]="product.title" <== error here
name="title" id="title" type="text" class="form-control" required>
            <div class="alert alert-danger" *ngIf="title.touched && title.invalid">
              Title is required
            </div>
          </div>

这是产品表单.组件.ts

import { Component, OnInit, OnDestroy } from '@angular/core';
import { CategoryService } from 'src/app/category.service';
import { ProductService } from 'src/app/product.service';
import { Router, ActivatedRoute } from '@angular/router';
import { take } from 'rxjs/operators';

@Component({
  selector: 'app-product-form',
  templateUrl: './product-form.component.html',
  styleUrls: ['./product-form.component.css']
})
export class ProductFormComponent implements OnInit {

  categories$;
  product;

  constructor(
    categoryService: CategoryService,
    private route: ActivatedRoute,
    private productService: ProductService,
    private router: Router) {
    this.categories$ = categoryService.getCategories();

    let id = this.route.snapshot.paramMap.get('id');
     if (id) this.productService.get(id).snapshotChanges().pipe(take(1))
.subscribe(p => this.product = p); <== this does not seem to be working
  }

  save(product) {
    this.productService.create(product);
    this.router.navigate(["/admin/products"]);
  }

  ngOnInit() {
  }

}

怎么做才能显示产品的标题?

共有3个答案

石正信
2023-03-14

错误是因为该值在启动时没有初始化。当变量从订阅中获取其第一个值时,就会发生这种情况,这需要一些时间来获取值,所以视图呈现并尝试在它存在之前获取值。我建议首先为您的数据创建一个模型,然后初始化您的模型。看看如何创建模型的打字稿中的模型类。您可以在启动时初始化它以避免错误,或者创建另一个变量,强制视图等待变量。

import { Component, OnInit, OnDestroy } from '@angular/core';
import { CategoryService } from 'src/app/category.service';
import { ProductService } from 'src/app/product.service';
import { Router, ActivatedRoute } from '@angular/router';
import { take } from 'rxjs/operators';

@Component({
  selector: 'app-product-form',
  templateUrl: './product-form.component.html',
  styleUrls: ['./product-form.component.css']
})
export class ProductFormComponent implements OnInit {

  categories$;
  product;
initialized : boolean = false

  constructor(
    categoryService: CategoryService,
    private route: ActivatedRoute,
    private productService: ProductService,
    private router: Router) {
    this.categories$ = categoryService.getCategories();

    let id = this.route.snapshot.paramMap.get('id');
     if (id) this.productService.get(id).snapshotChanges().pipe(take(1))
.subscribe(p => {
this.initialized = true
this.product = p

});}

  save(product) {
    this.productService.create(product);
    this.router.navigate(["/admin/products"]);
  }

  ngOnInit() {
  }

}

那么html将如下所示:

<div class="form-group">
            <label for="title">Title</label>
            <input #title="ngModel" *ngIf="initialized" [(ngModel)]="product.title"
name="title" id="title" type="text" class="form-control" required>
            <div class="alert alert-danger" *ngIf="title.touched && title.invalid">
              Title is required
            </div>
          </div>

您可以使用变量来创建您喜欢的加载指示器

傅涵忍
2023-03-14

改变

product;

product:any = {};

和(valueChanges()而不是snapshotChnages())

if (id) this.productService.get(id).snapshotChanges().pipe(take(1))
.subscribe(p => this.product = p); 
  }

if (id) this.productService.get(id).valueChanges().pipe(take(1))
.subscribe(p => this.product = p); <== this does not seem to be working
  }

已修复问题

曾骁
2023-03-14

您也可以使用

product:any = {};
 类似资料:
  • 在本教程的帮助下,我将使用条形码扫描仪和SQLite构建一个Ionic库存管理应用程序:https://www . tech iediaries . com/Ionic-Cordova-SQLite-Barcode-Scanner-product-Inventory-manager/ 当我添加这段代码时: …到数据服务。ts我得到这个错误: core . js:19866 ERROR ERROR:

  • 我正在设置一个带有反应的discord机器人,但第二个反应中有一个错误,按编号排列,但我找不到它。这可能是一个循环错误,但我已经尝试更改变量的名称,没有任何帮助。我也为代码的长度感到抱歉,但我已尝试将其缩短到最大值。 点击命令,机器人应该回复一条包含5种可能反应的消息。 如果我按反应1,会出现第二条消息,其中包含嵌入中的描述、不和谐和日期。 在这条消息的底部应该会出现一个反应✅。 除了当我按下这个

  • 这是我的功能。显示解析错误(data.ops[0])

  • 为什么我得到这个错误不能读取未定义的触摸属性? 为什么它不能读取,但它可以读取 当我们使用

  • 问题内容: 我正在制作非常简单的react应用。但是,当我尝试通过onChange事件调用父(实际上是祖父母)组件的方法时,我一直在获取。 这是触发事件的组件/表单(因此,在绑定的父组件上调用方法…是的,因为我通过道具将其从父组件传递下来,所以在方法上使用了.bound(this)。) 这是我如何通过大多数父(祖父母)组件中的props传递该方法的方法。 这是我作为父项(方法所有者和方法调用程序之

  • 我正在测试发送电子邮件与流星js和nodemailer插件: 流星添加捷运:流星NodeEmailer 当页面加载时,我在导航器的控制台上看到错误:无法读取未定义的属性“创建运输”。 那么问题是什么呢? 代码如下: /////////////////////////////////////////// ///////////////