如何使用*ngIf检查角度2模板中的空对象

Ali*_*ade 43 javascript typescript angular

我想检查我的对象是否为空,不要渲染我的元素,这是我的代码:

<div class="comeBack_up" *ngIf="previous_info != {}">
   <a 
      [routerLink]="['Inside_group_page',{'name':previous_info.path | dotTodash }]"
      >
        {{previous_info.title}}
   </a>
</div>
Run Code Online (Sandbox Code Playgroud)

但是我的代码错了,最好的方法是什么?

Gün*_*uer 87

这应该做你想要的:

<div class="comeBack_up" *ngIf="(previous_info | json) != ({} | json)">
Run Code Online (Sandbox Code Playgroud)

或更短

<div class="comeBack_up" *ngIf="(previous_info | json) != '{}'">
Run Code Online (Sandbox Code Playgroud)

每个都{}创建一个新实例,并且====总是导致不同对象实例的比较false.当它们转换为字符串===结果时true

Plunker的例子

  • `json`管道与Angular包提供的所有其他管道一样,无需额外注册即可全局使用. (2认同)
  • 如果您的对象具有循环引用,则此代码不起作用。Angular 会抛出一个 `ERROR TypeError: Converting circle structure to JSON` 异常。 (2认同)

Thi*_*ier 29

你也可以使用这样的东西:

<div class="comeBack_up" *ngIf="isEmptyObject(previous_info)"  >
Run Code Online (Sandbox Code Playgroud)

使用isEmptyObject组件中定义的方法:

isEmptyObject(obj) {
  return (obj && (Object.keys(obj).length === 0));
}
Run Code Online (Sandbox Code Playgroud)

  • 在 ngIf 中调用函数不是一个好的做法。导致无限调用并会影响应用程序的性能 (2认同)

Dam*_*ani 11

以上答案都可以.但我发现在视图中使用以下选项非常好:

{{previous_info?.title伪}}

可能是重复的问题 Angular2 - 如果不检查{{object.field}}是否存在则会出错

  • 如果您完全确定该对象在其非空状态下将具有"title"道具,则此方法有效 (3认同)

Sum*_*mit 11

从以上答案来看,以下方法无效或不太可取:

  • (previous_info | json) != '{}'仅适用于{}空箱,不适用于nullundefined
  • Object.getOwnPropertyNames(previous_info).length也无法正常工作,因为Object无法在模板中访问
  • 我不想创建一个专用变量 this.objectLength = Object.keys(this.previous_info).length !=0;
  • 我不想创建专用功能

    isEmptyObject(obj) {
       return (obj && (Object.keys(obj).length === 0));
    }
    
    Run Code Online (Sandbox Code Playgroud)

解决方案: 键值管道以及?。(安全导航操作员);看起来很简单。

previous_info = nullprevious_info = undefinedprevious_info = {}视为虚假值时,它可以很好地工作。

<div  *ngIf="(previous_info | keyvalue)?.length">
Run Code Online (Sandbox Code Playgroud)

keyvalue-将Object或Map转换为键值对数组。

-Angular安全导航运算符(?。)是防止null和undefined的一种流畅便捷的方法

  • 我认为这是最好的解决方案,因为在模板中放置isEmptyObject()函数会导致每当发生更改检测时调用它。我发现这种情况已经发生了很多,例如只需单击页面上的任意位置即可。 (2认同)

Lok*_*oke 5

这为我工作:

检查length属性并使用?以避免undefined错误。

因此,您的示例将是:

<div class="comeBack_up" *ngIf="previous_info?.length">
Run Code Online (Sandbox Code Playgroud)

更新

length属性仅存在于数组上。由于问题是关于对象的,因此可以使用Object.getOwnPropertyNames(obj)从对象获取属性数组。该示例变为:

<div class="comeBack_up" *ngIf="previous_info  && Object.getOwnPropertyNames(previous_info).length > 0">
Run Code Online (Sandbox Code Playgroud)

previous_info &&被添加到检查对象存在。如果它求值到true下一条语句,则检查对象是否至少按比例。它不检查该属性是否具有值。