Итак, у меня есть базовый <ul> в Angular 5, содержащий * ngFor, который заполняет своих потомков <li> на основе массива. Ничего особенного. Теперь я хочу, чтобы при наведении курсора на каждый ли становились видимыми карандаш и значок корзины. До сих пор мне удавалось отображать значки карандаша и корзины все одновременно, но это не то поведение, которое я ищу. Я хочу, чтобы пользователь мог видеть, что для каждого конкретного li.
Это мой код, адаптированный после этого Plunk: https://embed.plnkr.co/xgI5jOPI9HDUJb71RfmT/.
<ul class = "list-group">
<li class = "list-group-item" (dblclick) = "editTodo(todo)" *ngFor = "let todo of todosList">
<span (mouseenter) = "mouseOvered=true" (mouseleave) = "mouseOvered=false">
{{todo.text}}
<i [className] = "mouseOvered ? 'fa fa-pencil' : 'hidden'" (click) = "editTodo(todo)"></i>
<i [className] = "mouseOvered ? 'fa fa-trash' : 'hidden'" (click) = "deleteTodo(todo)"></i>
</span>
</li>
</ul>
Изменить на основе предложения Сакшама:
Я добавил 2 метода, mouseEnter (todo) и mouseLeave (todo), и внутри них я назначил свойство mouseOvered конкретному наведенному на него todo. Итак, мой код выглядит так:
app.component.html
...
<span (mouseenter) = "mouseEnter(todo)" (mouseleave) = "mouseLeave(todo)">
{{todo.text}}
<i [className] = "todo.mouseOvered ? 'fa fa-pencil' : 'hidden'" (click) = "editTodo(todo)"></i>
<i [className] = "todo.mouseOvered ? 'fa fa-trash' : 'hidden'" (click) = "deleteTodo(todo)"></i>
</span>
app.component.ts
mouseEnter(todo) {
todo.mouseOvered = true;
}
mouseLeave(todo) {
todo.mouseOvered = false;
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Что вы можете сделать, так это добавить новое свойство мышь к каждому объекту в todosList и инициализировать его с помощью false.
Затем все, что вам нужно сделать, это:
<ul class = "list-group">
<li class = "list-group-item" (dblclick) = "editTodo(todo)" *ngFor = "let todo of todosList">
<span (mouseenter) = "todo.mouseOvered=true" (mouseleave) = "todo.mouseOvered=false">
{{todo.text}}
<i [className] = "todo.mouseOvered ? 'fa fa-pencil' : 'hidden'" (click) = "editTodo(todo)"></i>
<i [className] = "todo.mouseOvered ? 'fa fa-trash' : 'hidden'" (click) = "deleteTodo(todo)"></i>
</span>
</li>
</ul>
Не уверен, что это лучший подход, но он сработает.
Спасибо за ответ Сакшам. На самом деле я не могу создать экземпляр объекта todo с помощью свойства mouseOvered, но ваше предложение дало мне другую идею. Я отредактирую свой вопрос, используя полученный код.