Написание пользовательской директивы для добавления всплывающих подсказок к ng-опциям в AngularJS (TypeScript)

У меня есть некоторый HTML-код, который в настоящее время заполняет поле выбора с помощью директивы ng-options. Наша проблема в том, что ng-options не поддерживает использование всплывающих подсказок. Чтобы решить эту проблему, я пытаюсь написать пользовательскую директиву, но я новичок в AngularJS и TypeScript, поэтому я не уверен, куда идти оттуда, где я нахожусь.

Вот соответствующий код:

HTML

<select grid-column-tooltip class = "select-box" id = "availableColumn" size = "5" 
        ng-options = "column as column.localizedTitle for column in vm.availableColumns | filter: vm.environmentMatches track by column.field" 
        ng-model = "vm.availableColumnElement"
        ng-dblclick = "vm.moveToSelectedColumns()">
    <option value = "" ng-if = "false"></option>
</select>

В объекте column есть поле с именем environmentLabel, которое я хочу отображать в виде всплывающей подсказки при наведении курсора.

Javascript

module psfc {
class GirdColumnTooltipDirective implements ng.IDirective {
    restrict = 'A';

    template = '<div class = "grid-column-tooltip">{{column.environmentLabel}}</div>';
    constructor(
    ) { }       

    static directive = (): ng.IDirectiveFactory => {
        return () => new GirdColumnTooltipDirective();
    }
}

angular
    .module('psfc')
    .directive('gridColumnTooltip', GirdColumnTooltipDirective.directive());
}

Это, очевидно, очень неполное, потому что я не уверен, как реализовать то, что я хочу, в машинописном тексте. Я также не уверен, стоит ли превращать шаблон в div, который появляется при наведении курсора, или найти способ добавить атрибут title к соответствующему элементу option.

Кроме того, в зависимости от решения, я пока не беспокоюсь о CSS. Я могу исправить любые проблемы со стилем позже.

Почему вы помечаете TypeScript? Если это AngularJS, это Javascript, а не TypeScript. Вы можете получить лучшую помощь с правильными тегами.

Kevin FONTAINE 09.04.2019 13:55

Это и то, и другое. AngularJS может быть TypeScript или чистым Javascript. В этом случае я бы хотел использовать AngularJS для TypeScript.

Justin 09.04.2019 14:04

Поскольку вы новичок в AngularJS, рассмотрите возможность использования настраиваемых плагинов выбора, потому что работа с ng-options будет либо слишком сложной, либо результат будет полон ошибок. И этот вопрос касается AngularJS, а не TypeScript, поэтому, пожалуйста, удалите тег typescript.

wrager 09.04.2019 14:45

Вы рассматривали возможность использования $uibpopover из начальной загрузки?

Tom Edwards 09.04.2019 14:55
Знаете ли вы, что директивы являются одной из самых мощных и универсальных функций Angular?
Знаете ли вы, что директивы являются одной из самых мощных и универсальных функций Angular?
Директивы позволяют расширять HTML новыми элементами и атрибутами и даже создавать собственные структурные директивы для манипулирования DOM. С...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
3
4
638
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для простоты мы просто заменили ng-options на использование ng-repeat внутри select. Гораздо проще, чем писать пользовательскую директиву.

HTML

<select class = "select-box" id = "availableColumn" size = "5"
        ng-dblclick = "vm.moveToSelectedColumns()">
    <option ng-repeat = "column in vm.availableColumns | filter: vm.environmentMatches track by column.field"
            value = "column.field"
            ng-click = "vm.availableColumnElement = column"
            title = "{{column.localizedTitle}}">
         {{column.localizedTitle}}
     </option>
</select>

Обратите внимание, что тег option не поддерживает атрибут title. Даже если он работает в некоторых браузерах, он не соответствует стандарту и не все браузеры его поддерживают. Например, Edge не показывает заголовок.

wrager 09.04.2019 18:18

Я понимаю, что это не стандарт, поскольку option является неполной частью элемента select, но после тестирования оказалось, что он работает во всех поддерживаемых нами браузерах (включая Edge и IE).

Justin 09.04.2019 21:04

Другие вопросы по теме