12

Creating an angular2 app using angular 2 seed BS4. The component uses a pipe and it worked when i was playing with the Angular2 Quickstart but doesnt when using Angular2-Seed-BS4

When i run i get:-

>     EXCEPTION: Template parse errors: Parser Error: Unexpected token | at column 32 in [ngFor let awsoffer of awsoffers| keys2] in
> AWSOfferListComponent@2:9 ("<h3>AWS Offer List Elements:</h3> <ul>  
> <table [ERROR ->]*ngFor="let awsoffer of awsoffers| keys2">
>     <th>{{awsoffer.key}}</th>
>     <div *ngFor="let awso2 o"): AWSOfferListComponent@2:9 Parser Error: Unexpected token . at column 28 in [ngFor let awso2 of
> awsoffer.value| keys2] in AWSOfferListComponent@4:9 ("   <table
> *ngFor="let awsoffer of awsoffers| keys2">
>     <th>{{awsoffer.key}}</th>
>     <div [ERROR ->]*ngFor="let awso2 of awsoffer.value| keys2">
>     <tr>
>     <td>{{awso2.key}}</td> "): AWSOfferListComponent@4:9

I have had this code work outside of the angular-seed project so I must have something wrong when moving the logic to within the structure - but i cant see what it is. Searching google seems to indicate that its to do with the pipe module not being loaded but it appears that it is - no 404 errors.

Component:-

import { Component, OnInit } from 'angular2/core';
import { AWSOfferService } from '../../../shared/services/aws-offer.service';
import { AWSOffer } from './aws-offer';
import { KeysPipe } from '../../../shared/pipes/keys.pipe';
import { KeysMultPipe } from '../../../shared/pipes/keys2.pipe';




@Component({
  selector: 'aws-offer-list',
  templateUrl: './pages/aws-offers/components/aws-offer-list.html',
  styles: ['.th {color:red;}'],
  pipes : [KeysPipe, KeysMultPipe]
})

export class AWSOfferListComponent implements OnInit {
  constructor (private AWSOfferService: AWSOfferService) {}
  errorMessage: string;
  awsoffers: AWSOffer[];
  ngOnInit() { this.getAWSOffers(); }

  getAWSOffers() {
      this.AWSOfferService.getAWSOffers().subscribe(awsoffers => this.awsoffers = awsoffers,
                                        error =>  this.errorMessage = <any>error);
  }
}

Template:-

<h3>AWS Offer List Elements:</h3>
<ul>
  <table *ngFor="let awsoffer of awsoffers| keys2">
    <th>{{awsoffer.key}}</th>
    <div *ngFor="let awso2 of awsoffer.value| keys2">
    <tr>
    <td>{{awso2.key}}</td>
    <td>{{awso2.value}}</td>
    </tr>
    </div>
  </table>
</ul>

Pipe definition:-

import { PipeTransform, Pipe } from 'angular2/core';

@Pipe({name: 'keys2'})
export class KeysMultPipe implements PipeTransform {
  transform(value, args:string[]) : any {
    let keys = [];
    for (let key in value) {
      keys.push({key: key, value: value[key]});
    }
    return keys;
  }
}

Screen shot of the project structure. File structure

Any ideas?

Thanks in advance

1 Answer 1

13

Only with version beta.17 you can write:

<div *ngFor="let item of items">  // let instead of #

Since Angular2-Seed-BS4 uses angular beta.2 (https://github.com/start-angular/SB-Admin-BS4-Angular-2/blob/master/package.json#L90) you have to write like this:

<table *ngFor="#awsoffer of awsoffers | keys2">
...
<div *ngFor="#awso2 of awsoffer.value | keys2">

This link may be of interest to you https://github.com/angular/angular/blob/master/CHANGELOG.md#user-content-200-beta17-2016-04-28

Sign up to request clarification or add additional context in comments.

1 Comment

Awesome. That got it. Thanks very much

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.