【问题标题】:How to fix console errors on component start如何修复组件启动时的控制台错误
【发布时间】:2020-03-04 01:19:37
【问题描述】:

我的一个项目组件有问题。当应用程序启动时,我调用 获取用户详细信息的“getAboutMeById”函数和“site-header.component.ts”我在控制台中收到以下错误,但我可以在页面加载完成后看到图像。

我尝试将数据按原样放入服务中,但结果相同

组件:

export class SiteHeaderComponent implements OnInit {
  aboutMe: AboutMe = null;
  year: number = new Date().getFullYear();
  @Output() navigationClickFired = new EventEmitter<string>();
  constructor(private moranmonoService: MoranMonoService) { }
  ngOnInit() {
    this.getAboutMeById(1);
  }
  getAboutMeById(id: number) {
    this.moranmonoService.GetAboutMeById(id).subscribe(res => {
      let result = <AboutMe>res;
      if (result != null) {
        this.aboutMe = new AboutMe(result.name, result.emailAddress, result.phoneNumber, result.homeAddress, result.profilePhotoUrl,
          result.profession, result.introduction, result.cvFileUrl, result.experience);
      } else {
        console.log('AboutMeComponent | getAboutMeById: Encountered an error.', result);
      }
    });
  }
  onNavigationClick(linkName: string) {
    this.navigationClickFired.emit(linkName);
  }
}

html代码:

<header id="site_header" class="header mobile-menu-hide">
  <div class="header-content clearfix">
    <div class="my-photo">
      <img src="{{aboutMe.profilePhotoUrl}}" alt="image" class="img-responsive" style="max-width: 100px">
    </div>
    <div class="site-title-block">
      <div class="site-title">{{ aboutMe.name }}</div>
    </div>
    <div class="site-nav">
      <ul id="nav" class="site-main-menu">
        <li>
          <a class="pt-trigger" (click)="onNavigationClick('AboutMe')" href="#about-me">About Me</a>
        </li>
        <li>
          <a class="pt-trigger" (click)="onNavigationClick('Resume')" href="#resume">Resume</a>
        </li>
        <!-- <li>
      <a class="pt-trigger" href="#portfolio">Portfolio</a>
    </li>
    <li>
      <a class="pt-trigger" href="#blog">Blog</a>
    </li> -->
        <li>
          <a class="pt-trigger" (click)="onNavigationClick('Contact')" href="#contact">Contact</a>
        </li>
      </ul>
    </div>
    <div class="copyrights">All rights {{ year }}</div>
  </div>
</header>
<div class="mobile-header mobile-visible">
  <div class="mobile-logo-container">
    <div class="mobile-header-image">
      <a href="#">
          <img src="{{aboutMe.profilePhotoUrl}}" alt="image">
      </a>
    </div>
    <div class="mobile-site-title"><a href="#">{{aboutMe.name}}</a></div>
  </div>

  <a class="menu-toggle mobile-visible">
    <i class="fa fa-bars"></i>
  </a>
</div>
<div class="lmpixels-arrows-nav">
  <div class="lmpixels-arrow-left"><i class="lnr lnr-chevron-left"></i></div>
  <div class="lmpixels-arrow-right"><i class="lnr lnr-chevron-right"></i></div>
</div>

服务:

@Injectable({
  providedIn: 'root'
})
export class MoranMonoService {
  baseurl = environment.baseURL;
  constructor(private httpClient: HttpClient) { }


  GetAboutMeById(id: number) {
    let reqHeader = new HttpHeaders();
    reqHeader.append('Content-Type', 'application/json');
    return this.httpClient.get(this.baseurl + 'api/AboutMe/get-aboutme-byId?id=' + id, { headers: reqHeader });
  }
  GetResumeEntities() {
    return this.httpClient.get(this.baseurl + 'api/Resume/get-resume-entites');
  }
  GetExperienceEntities() {
    return this.httpClient.get(this.baseurl + 'api/Experience/get-expirence-entites');
  }
  SendEmail(contact: Contact) {
    return this.httpClient.post(this.baseurl + 'api/contact/send-email', contact);
  }
}

我希望图像加载没有错误,但我收到以下错误:

ERROR TypeError: Cannot read property 'profilePhotoUrl' of null
at Object.eval [as updateRenderer] (SiteHeaderComponent.html:29)
at Object.debugUpdateRenderer [as updateRenderer] (core.js:11080)
at checkAndUpdateView (core.js:10456)
at callViewAction (core.js:10692)
at execComponentViewsAction (core.js:10634)
at checkAndUpdateView (core.js:10457)
at callViewAction (core.js:10692)
at execComponentViewsAction (core.js:10634)
at checkAndUpdateView (core.js:10457)
at callWithDebugContext (core.js:11344)

【问题讨论】:

  • console.log(result) 内订阅?或者你可能需要这个:*ngIf="aboutMe" 然后aboutMe.profilePhotoUrl
  • 问题出在 SiteHeaderComponent.html 内部。可以附上吗?
  • 您在 SiteHeaderComponent.html 第 29 行遇到的问题,请添加您的代码
  • 我添加了html代码

标签: c# node.js angular typescript asp.net-core


【解决方案1】:

我的猜测是您的 SiteHeader 组件的 html 文件正在尝试访问 aboutMe 变量,而您的服务尚未加载数据。等待数据上传,你的aboutMe变量还处于初始状态,为null。

如果错误与“profilePhotoUrl”属性有关,那是因为它必须是您的 html 文件中第一个需要的属性。

解决方案是将所有基于 aboutMe 变量的 html 元素包装在一个带有 *ngIf 的元素中

<div *ngIf="aboutMe">
  <img src="aboutMe.profilePhotoUrl" />
<div>

【讨论】:

  • 谢谢,但这是唯一的解决方案,你知道为什么会这样吗?这是普遍现象吗?
  • 在 javascript 中,这实际上是一个非常常见的错误。这是因为它是异步的。当您的组件 siteHeader 调用服务以加载数据时,它不会等待加载数据以呈现组件。即使你的 observable 没有完成它的任务,它也会继续运行。实际上还有其他方法可以处理它,但这是最常用的一种。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2020-01-31
  • 1970-01-01
相关资源
最近更新 更多