【问题标题】:Cannot assign to a reference or variable! (different situation than linked to)无法分配给引用或变量! (与链接不同的情况)
【发布时间】:2019-12-25 21:43:59
【问题描述】:

尽管问题的措辞相似,但这个问题不能通过this one 之类的答案解决。

我正在使用自定义组件,并按预期进行以下工作。没有错误,没有警告。

<app-setter [(setting)]="records[0]"></app-setter>
<app-setter [(setting)]="records[1]"></app-setter>
<app-setter [(setting)]="records[2]"></app-setter>

当然,我更喜欢使用这样的模板生成器。

<app-setter *ngFor="let record of records;"
            [(setting)]="record"></app-setter>

这会产生以下错误。

无法分配给引用或变量!

谷歌搜索会导致很多关于同一主题的点击 - 组件中的变量与生成的标签的 ID 之间存在冲突。据我所知,这里不是这种情况。我将组件中的唯一字段重命名为 records,我什至没有看到任何 ID 分配给生成的标签。

问题的原因可能是什么?如何进一步诊断?我不确定如何学习实际发生的地方(它是 compiler.js:xxxx,它告诉我什么都没有)。

编辑

我尝试了以下但没有成功。

<ng-container *ngFor="let record of records;">
  <app-setter [(setting)]="record"></app-setter>
</ng-container>

但是,我注意到从香蕉盒中取出香蕉会使错误消失(当然结果是双向绑定被破坏。这有效:

<ng-container *ngFor="let record of records;">
  <app-setter [setting]="record"></app-setter>
</ng-container>

它告诉我的很少。但它说明了什么,对吧?

组件代码如下所示。

export class AssessmentComponent implements OnInit {
  constructor() { }
  records: Record[];
  ngOnInit() { this.records = [new Record("x", 3), new Record("y", 2)]; }
  onAddition(event: Record) { console.log(); }
}

【问题讨论】:

  • 请提供您的问题的堆栈闪电,我们看到的代码应该可以工作。
  • 如果您的设置是一个对象,您不需要使用@Output - 允许对对象的属性进行任何更改-,但代码必须有效
  • @AJT_82 不,显然不应该。我自己有点惊讶,但显然,必须通过索引引用原始数组而不是单个项目。至少,这行得通,而这行不通。检查下面的答案。我也会为努力和额外的洞察力 +1。此外,如果您有任何想法,请随时提出为什么我们需要这样做。
  • 这就是我要求演示的原因,一定有一些我们没有看到的东西,因为你不应该需要像在任何一个答案中那样做;)那里我们看到的代码绝对没有问题。
  • @AJT_82 很好,所以不是我发疯了,哈哈。

标签: angular typescript angular2-template


【解决方案1】:

您需要像这样使用 *ngFor 循环设置索引。

 <app-setter *ngFor="let record of records; let i = index"
                [(setting)]="records[i]">
 </app-setter>

就像我在其他解决方案的评论中提到的那样,Nikhil 关于使用 ng-container 的建议是一种很好的做法。虽然您不在这里执行此操作,但如果您需要在同一元素上使用 *ngIf 和 *ngFor,请使用另一个答案中描述的 ng-container,它会产生所需的效果。

【讨论】:

  • 两件事。 (1) 关于风格的好建议,我同意但不回答我的问题。 (2),哎呀,它确实回答了我的问题! (我在一段时间内将一连串的想法烘焙到这里的一条评论中。)随着问题的解决,这绝对是绿色检查。您是否会受到 +1 的诱惑来分享一些关于为什么简单的 record 行不通以及我们必须使用数组中的索引的原因?还是需要+50的赏金? (我对我的代表很吝啬,所以 50 岁是一个巨大的荣誉,你知道...)
  • 不需要赏金,很高兴我能提供帮助。我的理解是,由于您使用双向绑定,因此您需要隐式提供索引,以分别将正确的“记录”对象与每个数组中的“设置”对象相关联。由于您没有为每条记录定义单独的 html 属性,因此它需要一个唯一的属性才能正确绑定。 (这是我的理解..如果我理解错了请纠正我)
【解决方案2】:

编辑: 感谢 @thenolin 解决这个问题。但是从OP提供的内容来看,我认为我们应该使用records[i]而不是record[i]

<app-setter *ngFor="let record of records; let i = index" [(setting)]="records[i]">
</app-setter>

另外,不需要使用&lt;ng-container&gt;

原答案:

<ng-container *ngFor="let record of records;">
   <app-setter [(setting)]="record"></app-setter>
</ng-container>

ng-container 是一个不影响样式或布局的分组元素。

您可以用&lt;div&gt; 或任何其他元素替换上面sn-p 中的&lt;ng-container&gt;,但这可能会影响您的布局。

【讨论】:

  • 你确定 ng-container 是 Angular 指令吗?它看起来很像 AngularJS 的东西......
  • 不,它也在 Angular 中 - angular.io/guide/….
  • @thenolin - 我认为索引是不必要的。通过按照您的回答中所述执行记录 [i],我们本质上是在使用记录 [0][0]、记录[1][1]、记录[2][2]。不知道为什么这对 OP 有效。
  • @thenolin - 在这种情况下,我们应该只使用records[i],而不是record[i]。我认为我们没有足够的信息来完全理解这个问题。您对索引的看法是正确的:stackoverflow.com/a/47567879/2924577
  • @Nikhil 是的,它需要是 record S [i] - 可能只是一个错字。
猜你喜欢
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多