Angular2 — HostListener/привязка с элементом NgFor

У меня есть список пользователей. Я хочу, чтобы при наведении курсора на кнопку он устанавливал *ngIf в значение true, а затем отображал информацию о пользователе (и false, когда курсор покидает кнопку).

список пользователей.html

<div *ngFor="let user of users">
  <h1>{{user.name}}</h1>
  <div onUserHover *ngIf="ngIf">
    <p>{{user.description}}</p>
  </div>
</div>

список пользователей.component.ts

import { Component, OnInit } from '@angular/core';
import { User } from 'class/user';
import { UserService } from 'user/user.service';

@Component({
  selector: 'user-list',
  templateUrl: 'user-list.component.html',
  providers: [UserService]
})
export class UserListComponent implements OnInit {
  users: User[];

  constructor(private userService: UserService) {
  };

  ngOnInit(): void {
    this.getUsers();
  }

  getUsers(): void {
    this.userService.getUsers().then(users => this.users = users);
  }

  toggleUser(user: User): void {
    user.active = !user.active;
  }
}

Я использовал «toggleUser (пользователь: пользователь)» следующим образом -> (щелчок) = «toggleUser (пользователь)», однако теперь я хочу использовать onHover вместо щелчка.

Я видел учебник об атрибутах директив на веб-сайте Angular.io и тему stackOverflow на HostBinding('ngIf').

Hostbinding ngIf в Angular2

onUserHover.directive.ts

 import { Directive, ElementRef, HostBinding, HostListener } from '@angular/core';

@Directive({ selector: '[onUserHover]' })
export class OnUserHoverDirective {

    constructor(private el: ElementRef) {
    }

    @HostBinding('ngIf') ngIf: boolean;

    @HostListener('mouseenter') onMouseEnter() {
        console.log('onMouseEnter');
        this.ngIf = true;
    }

    @HostListener('mouseleave') onmouseleave() {
        this.ngIf = false;
    }
}

Но у меня есть одна ошибка в браузере:

Can't bind to `ngIf` since it isn't a known property of `div`

Что я могу сделать, чтобы реализовать эту функцию в стиле Angular2?


person SolidCanary    schedule 31.03.2017    source источник
comment
Вы можете просто сделать это с помощью CSS, тогда почему вы делаете вещи такими сложными?   -  person Vivek Doshi    schedule 31.03.2017
comment
@VivekDoshi Я бы предпочел сделать это и в коде, избегая правил CSS. Упрощенная отладка.   -  person Randy    schedule 31.03.2017
comment
Вероятно, у вас есть проблема с привязкой this, ссылающейся на элемент HTML вместо вашего класса. Вместо этого попробуйте привязать функцию к вашему классу.   -  person Randy    schedule 31.03.2017
comment
это вообще не имеет смысла. Вы не можете получить доступ к родительскому ngIf из своей директивы, плюс вы хотели бы добавить содержимое, когда оно наведено и удалено, когда мышь уйдет. Как вы хотите навести курсор на несуществующий элемент?   -  person n00dl3    schedule 31.03.2017
comment
@ n00dl3 n00dl3 Если вы присмотритесь, то увидите, что ngIf на самом деле очень плохо названное логическое значение, а не модуль Angular ngIf.   -  person Randy    schedule 31.03.2017
comment
он не может получить доступ к ngIf родителя: *ngIf="ngIf"   -  person n00dl3    schedule 31.03.2017
comment
@ n00dl3 Это потому, что это зарезервированное ключевое слово? Он объявляет это в своем файле как @HostBinding('ngIf') ngIf: boolean;   -  person Randy    schedule 31.03.2017
comment
вы не можете изменять переменные родительского компонента, за исключением случаев, когда это явно указано с бананом в привязке коробки, например [(ngModel)], и с использованием EventEmitter в дочернем элементе... Однако зависание несуществующего элемента для меня загадка...   -  person n00dl3    schedule 31.03.2017


Ответы (1)


Что вы забыли, так это привязать переменную к элементу

<div onUserHover [ngIf]="ngif" *ngIf="ngIf">

Ваша директива не работает ?

Вы не забыли добавить директиву в атрибут объявлений @NgModule? Это легко забыть! Откройте консоль в инструментах браузера и найдите такую ​​ошибку:

ИСКЛЮЧЕНИЕ: Ошибки синтаксического анализа шаблона: невозможно привязать к «myHighlight», так как это неизвестное свойство «p».

Angular обнаруживает, что вы пытаетесь выполнить привязку к чему-либо, но не может найти эту директиву в массиве объявлений модуля. После указания HighlightDirective в массиве объявлений Angular знает, что может применить директиву к компонентам, объявленным в этом модуле.

person Roman C    schedule 31.03.2017
comment
Вместо HostBinding в .directive? - person SolidCanary; 31.03.2017
comment
Я сделал @HostBinding('ngIf') @Input() ngIf: boolean; в .директиве. Однако это все еще известное свойство - person SolidCanary; 31.03.2017
comment
Можете ли вы закончить фразу Однако это все еще известное свойство? - person Roman C; 31.03.2017
comment
Браузер по-прежнему показывает мне ту же ошибку. Не удается связать с «ngIf», так как это неизвестное свойство ‹div› [ОШИБКА -›]‹div onUserHover [ngIf]=ngIf *ngIf=ngIf› - person SolidCanary; 31.03.2017
comment
Это потому, что у вас нет переменной ngIf в компоненте. Я также сомневаюсь, что вы можете использовать обе директивы на одном и том же div. - person Roman C; 31.03.2017