不能在*ngFor:angular2中使用*ngIF

fir*_*baa 6 json typescript angular2-directives angular2-services angular

我正在使用来自服务的angular2和i'im绑定数据,问题是当我加载数据时我应该用id过滤它,这是我应该做的:

<md-radio-button
        *ngFor="#item of items_list"
        *ngIf="item.id=1"
        value="{{item.value}}" class="{{item.class}}" checked="{{item.checked}}"> {{item.label}}
</md-radio-button>
Run Code Online (Sandbox Code Playgroud)

这是数据:

[
  { "id": 1, "value": "Fenêtre" ,"class":"md-primary" ,"label":"Fenêtre" ,"checked":"true"},
  { "id": 2, "value": "Porte Fenêtre" ,"class":"" ,"label":"Porte Fenêtre" }

]
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我只想接受id = 1的数据,但我看到了这个错误:

EXCEPTION: Template parse errors:
Parser Error: Bindings cannot contain assignments at column 14 in [ngIf item.id=1] in RadioFormesType1Component@10:16 ("
        <md-radio-button
                *ngFor="#item of items_list"
                [ERROR ->]*ngIf="item.id=1"
                value="{{item.value}}" class="{{item.class}}" checked="{{item.check"): RadioFormesType1Component@10:16
Run Code Online (Sandbox Code Playgroud)

有什么建议一起使用ngif和ngfor?

Thi*_*ier 11

您可以使用以下内容:

*ngIf="item.id===1"
Run Code Online (Sandbox Code Playgroud)

代替

*ngIf="item.id=1"
Run Code Online (Sandbox Code Playgroud)

您尝试将某些内容分配给id属性(运算符=),而不是测试其值(运算符=====).

此外,不支持同一元素上的ngFor和ngIf.你可以尝试这样的事情:

<div *ngFor="#item of items_list">
  <md-radio-button
      *ngIf="item.id===1"
      value="{{item.value}}" class="{{item.class}}"
      checked="{{item.checked}}">
    {{item.label}}
  </md-radio-button>
</div>
Run Code Online (Sandbox Code Playgroud)

要么

<template ngFor #item [ngForOf]="items_list">
  <md-radio-button
      *ngIf="item.id===1"
      value="{{item.value}}" class="{{item.class}}"
      checked="{{item.checked}}">
    {{item.label}}
  </md-radio-button>
</template>
Run Code Online (Sandbox Code Playgroud)


Gün*_*uer 8

*ngIf并且*ngFor不支持相同的标签.您需要使用带有显式<template>标记的长格式.

更新

而不是<template>使用<ng-container>允许使用与内联*ngIf和语法相同的语法*ngFor

<ng-container *ngFor="#item of items_list">
  <md-radio-button
        *ngIf="item.id=1"
        value="{{item.value}}" class="{{item.class}}" checked="{{item.checked}}"> {{item.label}}
  </md-radio-button>
</ng-container>
Run Code Online (Sandbox Code Playgroud)


dfs*_*fsq 8

另一种解决方案是创建自定义过滤管道:

import {Pipe} from 'angular2/core';

@Pipe({name: 'filter'})
export class FilterPipe {
  transform(value, filters) {

    var filter = function(obj, filters) {
      return Object.keys(filters).every(prop => obj[prop] === filters[prop])
    }

    return value.filter(obj => filter(obj, filters[0]));
  }
}
Run Code Online (Sandbox Code Playgroud)

并在组件中使用它:

<md-radio-button
  *ngFor="#item of items_list | filter:{id: 1}"
  value="{{item.value}}" class="{{item.class}}" checked="{{item.checked}}"> {{item.label}}
</md-radio-button>
Run Code Online (Sandbox Code Playgroud)

需要在组件上注册自定义管道:

@Component({
  // ...
  pipes: [FilterPipe]
})
Run Code Online (Sandbox Code Playgroud)

演示: http ://plnkr.co/edit/LK5DsaeYnqMdScQw2HGv?p = preview