2016-04-17 3 views
3

Я использую Угловая 2.Как правильно использовать Наблюдаемый список?

Когда у меня есть только один элемент, я могу использовать nativeElement первый, а затем использовать Observable.

<div #aaa></div> 

@ViewChild('aaa') private aaa: ElementRef; 
ngAfterViewInit() { 
    console.log(Observable.fromEvent(this.aaa.nativeElement), 'mouseenter'); 
} 

Но теперь у меня есть список, я не могу использовать тот же способ сделать это:

<a *ngFor="#user of users" #aaa (mouseenter)="mouseEnter($event, user)"> 
    {{user}} 
</a> 

@ViewChild('aaa') private aaa: ElementRef; 
ngAfterViewInit() { 
    console.log(Observable.fromEvent(this.aaa.nativeElement), 'mouseenter'); 
} 

Он покажет ошибку:

EXCEPTION: TypeError: Cannot read property 'nativeElement' of null

Когда Мышки двигаться в каждый элемент , Я хочу, чтобы он делал разные вещи, используя Observable. Как я могу правильно использовать Observable в этом случае?

+0

@ViewChildren ('ААА') hrefs: QueryList ; – yurzui

+0

и в ngAfterViewInit: this.hrefs.toArray(). ForEach ((child) => console.log (Observable.fromEvent (child.nativeElement, 'mouseenter'))); – yurzui

+0

@yurzui Спасибо за помощь! –

ответ

5

С точки зрения того, как сделать то, что вы пытаетесь сделать здесь, я хотел бы предложить:

@Component({ 
    template: ` 
    <a *ngFor="#user of users" (mouseenter)="mouseEnters$.next({event: $event, user: user})"> 
    {{user}} 
    </a> 
    ` 
}) 
class YourComponent { 
    mouseEnters$: Subject<data:{event: MouseEvent, user: any}> = BehaviorSubject.create(); 

    ngAfterViewInit(){ //you don't actually need to wait for afterViewInit anymore 
     this.mouseEnters$.subscribe((data:{event:MouseEvent, user: any}) => /* do whatever */) 
    } 
} 

С точки зрения того, почему вы получаете исключение, вы получаете - вы не можете поставить переменную шаблона для элемента с ngFor на нем (что имеет смысл, когда вы понимаете, что элемент повторяется ...), и, следовательно, @ViewChild имеет значение NULL.

+0

не могли бы вы объяснить, почему мы не можем добавить локальную переменную с помощью * ngFor? –

+0

@PardeepJain Поскольку этот элемент будет повторяться n раз (где n - размер вашего списка пользователей). Какой из этих элементов будет «ааа»? – drewmoore

+0

Итак, в таком случае, какая локальная переменная? индекс * ngFor или что-то еще? –

0

Это зависит от того, что вы хотите сделать позже с user или event, Observable и ViewChild кажется слишком сложным, просто сделать:

<a *ngFor="#user of users" #aaa (mouseenter)="mouseEnter($event, user)"> 
    {{user}} 
</a> 

mouseEnter(event, user) { 
    console.log(event, user); 
    //do smth. i.e. this.eventEmitter.emit(user); 
} 
+0

Наблюдения только кажутся излишними, пока вы их не поймете. Как только вы это сделаете, вы будете рассматривать их как примитивный тип, который они эффективно в приложениях ng2. – drewmoore

+0

^^ Я только говорю это, потому что недавно я не понял их полностью и почувствовал то же самое. Теперь, когда я это делаю, мне больше нравится angular2 **. – drewmoore

+0

Ну, мой ответ относится к этому конкретному вопросу, а не к наблюдаемым вообще. Кажется, что для этого конкретного случая нет необходимости использовать наблюдаемое. – kemsky

Смежные вопросы