2017-07-13 2 views
0

depuis deux I'am essayer jours maintenant pour analyser un fichier JSON avec un objet imbriqué à l'intérieur qui se trouve à l'intérieur d'un ngIf ... le code sera plus explicite je pense:Est-il possible de mettre un ngFor dans un ngIf?

imaginer c'est donc une ouverture de composant enfant sous condition de un événement parent provenant d'un bouton:

Mon service http fonctionne parce que je l'utilise déjà dans d'autres composants et l'observable est "user3"

le code HTML parent:

<div class="parent"> 
     <img src="fold_down_black.png" type="button"(click)="toggleChild()"/> 
    <div><my-child [showMePartially]="showVar" ></my-child></div> 
    </div> 

Je lie à l'aide d'entrée comme suit dans les child.ts:

 @Input() showMePartially: boolean; 

Voici le child.html:

<div *ngIf="showMePartially" class="child" > 
    <span id="tfonc" *ngFor="let user3 of userService3.users3 | async">Fonctionnal duration : {{user3.data.operating_rate}}% 
    </span> 
</div> 

Voici mon service:

export interface User3 { 
data: any; 
} 
    const usersURL = 'http://my.supa.json;php'; 

@Injectable() 
export class UserService3 { 

    users3: Observable<User3[]>; 

    constructor (public http: Http) { 


      getData() { 

    const tick3$ = Observable.timer(100, 60000); 

    return tick3$.flatMap(() => this.http.get(usersURL)).map(res => 
res.json()); // .publishBehavior(<User3[]>[]).refCount(); 

Quand je l'ai fait rien dans la vue et rien dans la console aussi ... merci d'avance pour l'aide .. je suppose que le conflit vient d'un ngFor à l'intérieur d'un ngIf ...

+0

Vous essayez de boucle observable. Abonnez-vous à votre child.ts et assignez les données émises à un nouvel accessoire avec la valeur initiale de [] et faites-y une boucle. Alternativement, à partir de 4.x vous pouvez utiliser le tuyau 'async': http://angularjs.blogspot.com.by/2017/03/angular-400-now-available.html – wostex

+0

@wostex oui je veux utiliser le tuyau async ainsi mettre à jour mon post avec ... Je dur que j'abonne à parce que j'injecte ma UserService qui a déjà souscrit dans mon constructeur comme: constructeur (public userService3: UserService3) {} ngOnInit() {} } ...Est-ce exact? –

+0

@wostex devrais-je m'abonner à nouveau comme par exemple: public ngOnInit() { this.dataSubscription = this.userService3 (si dataSubscription: Abonnement;) –

Répondre

1

Je crois que le problème est que vous essayez de traverser users3 observable. Vous devez vous y inscrire à la place dans votre enfant. A l'intérieur de votre classe enfant:

myUsers = []; 
sub: Subscription; 

// inject a service. don't forget to import userService3 also 
constructor(private userService: userService3) {} 

ngOnInit() { 
    this.sub = this.userService.users3.subscribe(users => this.myUsers = users) // subscribe! 
} 
ngOnDestroy(){ 
    this.sub.unsubscribe(); 
} 

Dans votre modèle:

*ngFor="let user3 of users3 
+0

merci, je vais essayer ça maintenant! –

+0

@EmileCantero Je l'ai édité un peu pour que vous puissiez voir une différence entre les accessoires. – wostex

+0

Merci pour l'aide, semble que votre code renvoie une erreur dans la console, mais je n'ai toujours rien à mon avis..strange ... aussi de votre point de vue ne devrait pas utiliser ngOndestroy alors comme tel? ngOnDestroy() { if (this.users3) { this.users3.unsubscribe(); } } –