【问题标题】:Angular exception: Can't bind to 'ngForIn' since it isn't a known native property角度异常:无法绑定到“ngForIn”,因为它不是已知的本机属性
【发布时间】:2016-04-06 07:06:05
【问题描述】:

我做错了什么?

import {bootstrap, Component} from 'angular2/angular2'

@Component({
  selector: 'conf-talks',
  template: `<div *ngFor="let talk in talks">
     {{talk.title}} by {{talk.speaker}}
     <p>{{talk.description}}
   </div>`
})
class ConfTalks {
  talks = [ {title: 't1', speaker: 'Brian', description: 'talk 1'},
            {title: 't2', speaker: 'Julie', description: 'talk 2'}];
}
@Component({
  selector: 'my-app',
  directives: [ConfTalks],
  template: '<conf-talks></conf-talks>'
})
class App {}
bootstrap(App, [])

错误是

EXCEPTION: Template parse errors:
Can't bind to 'ngForIn' since it isn't a known native property
("<div [ERROR ->]*ngFor="let talk in talks">

【问题讨论】:

  • 试着把这个
    改成这个
    注意:“in”到“of”
  • 我猜你是C#/Java背景的,我也犯了同样的错误,用in代替Of

标签: angular angular2-directives


【解决方案1】:

因为这至少是我第三次在这个问题上浪费了超过 5 分钟,所以我想我会发布问答。我希望它可以帮助其他人……可能是我!

我在 ngFor 表达式中输入了 in 而不是 of

2-beta.17之前,应该是:

<div *ngFor="#talk of talks">

从 beta.17 开始,使用 let 语法而不是 #。有关更多信息,请参阅下方的更新。


请注意,ngFor 语法“脱糖”为以下内容:

<template ngFor #talk [ngForOf]="talks">
  <div>...</div>
</template>

如果我们改用in,它会变成

<template ngFor #talk [ngForIn]="talks">
  <div>...</div>
</template>

由于ngForIn 不是具有同名输入属性的属性指令(如ngIf),因此Angular 会尝试查看它是否是template 元素的(已知本机)属性,并且它不是,因此错误。

更新 - 从 2-beta.17 开始,使用 let 语法而不是 #。这将更新为以下内容:

<div *ngFor="let talk of talks">

请注意,ngFor 语法“脱糖”为以下内容:

<template ngFor let-talk [ngForOf]="talks">
  <div>...</div>
</template>

如果我们改用in,它会变成

<template ngFor let-talk [ngForIn]="talks">
  <div>...</div>
</template>

【讨论】:

  • 是的,记住 #talk 变量之前(正如您所说:“希望它可以帮助其他人……可能是我!” )
  • @Nobita,是的,那个人也经常绊倒我。我也为此写了一个问答:stackoverflow.com/questions/34012291/…
  • 当你意识到时太明显了......我发现它真的违反直觉,所以习惯了 for-in 风格。如果可以的话,我会更多地投票给你的问答帖子,谢谢
  • 谢谢马克。这不是最大的错误信息——比如 WTF 应该是“ngForIn”的意思!?但回想起来,呵呵!在找到您的问答之前,我为此挣扎了大约 20 分钟。
  • 我同意答案应该两者都有。但我进一步更新了答案,以更清楚地说明 beta.17 后的语法不同。 (我没有交换它,所以最新的是第一个)。相反,我只是放了一个小注释。乍一看,新手可能没有意识到最新的语法。这是一个微小的变化,但有很大的不同
【解决方案2】:

TL;DR;

使用 let...of 而不是 let...in !!


如果您是 Angular (>2.x) 的新手并且可能从 Angular1.x 迁移,您很可能会将 inof 混淆。正如 andreas 在下面的 cmets 中提到的,for ... of 迭代 values of 一个对象,而 for ... in 迭代 properties in 一个对象。这是 ES2015 中引入的新特性。

简单替换:

<!-- Iterate over properties (incorrect in our case here) -->
<div *ngFor="let talk in talks">

<!-- Iterate over values (correct way to use here) -->
<div *ngFor="let talk of talks">

因此,您必须在 ngFor 指令中in 替换为 of 以获取值。

【讨论】:

  • 顺便说一句 - 有谁知道使用“of”背后的原因,“in”在这里似乎是一个更自然的选择。
  • @mamsoudi @Morvael 不同之处在于for..in 迭代对象的键/属性,而for...of 迭代对象的值。 for(prop in foo) {}for(prop of Object.keys(foo)) {} 相同。这是 ECMA Script 2015 / ES6 的新语言特性。所以这只是一个远程的 Angular 问题。
  • 这就是你用 C# 编码多年然后转向 angular 时会发生的情况
【解决方案3】:

如果您想使用of 而不是切换到in,还有另一种选择。您可以使用 6.1 中引入的KeyValuePipe。您可以轻松地遍历对象:

<div *ngFor="let item of object | keyvalue">
  {{item.key}}:{{item.value}}
</div>

【讨论】:

    【解决方案4】:

    尝试在 angular final 中导入import { CommonModule } from '@angular/common';,因为*ngFor,*ngIf都存在于CommonModule

    【讨论】:

    • 我认为这个答案将是当今出现 OP 标题错误的更常见原因。
    【解决方案5】:

    使用 of 而不是 in。您可以使用 KeyValue 管道 。您可以轻松地遍历对象:

    <div *ngFor="let items of allObject | keyvalue">
      {{items.key}}:{{items.value}}
    </div>
    

    【讨论】:

      【解决方案6】:

      在我的例子中,WebStrom 自动完成插入小写的 *ngfor,即使看起来你选择了正确的驼峰式 (*ngFor)。

      【讨论】:

        【解决方案7】:

        我的问题是,Visual Studio 在复制和粘贴时以某种方式自动小写 *ngFor*ngfor

        【讨论】:

          【解决方案8】:

          基本上,如果您使用新类创建弹出窗口,那么此时您必须将该类添加到

          declarations: []
          

          base.module.ts or app.module.ts

          我的示例代码

          ##########################MY组件################### ###############

          @Component({
            selector: 'app-modal-content',
            templateUrl: './order-details.html',
            encapsulation: ViewEncapsulation.None,
            styles: []
          })
          
          export class NgbdModalContent {
            @Input() orderDetails: any;
            private orderId;
            private customer;
            private orderDate;
            private shipDate;
            private totalAmount;
            private salesTax;
            private shippingCost;
            private transactionStatus;
            private isPaid;
            private isMailSent;
            private paymentDate;
          
            // private orderDetails;
          
            constructor(public activeModal: NgbActiveModal) {
            }
          }
          

          ##########################基础模块################## ###############

          @NgModule({
              imports: [
                  CommonModule,
                  FormsModule
              ],
            declarations: [
              NavbarsComponent,
              NgbdModalContent,
            ]
          })
          export class BaseModule { }
          

          【讨论】:

            【解决方案9】:

            问:无法绑定到“pSelectableRow”,因为它不是“tr”的已知属性。

            A:需要在ngmodule中配置primeng tabulemodule

            【讨论】:

              【解决方案10】:

              我的解决方案是 - 只需从表达式中删除 '*' 字符 ^__^

              <div ngFor="let talk in talks">
              

              【讨论】:

                猜你喜欢
                相关资源
                最近更新 更多
                热门标签