Ответ 1
Вот трюк.
Twitter подсказки Bootstrap (для Angular -UI) есть возможность указать событие триггера с дополнительным атрибутом, как в data-trigger="mouseenter"
. Это дает вам возможность программным образом сменить триггер (с помощью Angular):
<input
ng-model="user.username"
name="username"
tooltip="Some text"
tooltip-trigger="{{{true: 'mouseenter', false: 'never'}[myForm.username.$invalid]}}"
/>
Поэтому, когда username
недействителен в $, выражение tooltip-trigger
будет оцениваться как 'mouseenter'
, и появится всплывающая подсказка. В противном случае триггер будет оценивать значение 'never'
, которое в свою очередь не запускает всплывающую подсказку.
EDIT:
@cotten (в комментариях) упоминает сценарий, в котором всплывающая подсказка застревает и не исчезнет, даже если модель действительна. Это происходит, когда мышь остается над полем ввода во время ввода текста (и модель становится действительной). Как только проверка модели оценит значение true, tooltip-trigger
переключится на "никогда" .
UI Bootstrap использует так называемый triggerMap
, чтобы определить, какие события мыши отображают/скрывают всплывающую подсказку.
// Default hide triggers for each show trigger
var triggerMap = {
'mouseenter': 'mouseleave',
'click': 'click',
'focus': 'blur'
};
Как вы можете видеть, эта карта ничего не знает о событии "никогда" , поэтому она не может определить, когда закрыть всплывающую подсказку. Итак, чтобы разглядеть трюк, нам нужно только обновить эту карту с помощью нашей собственной пары событий, а UI Bootstrap затем узнает, какое событие наблюдать за закрытием всплывающей подсказки, когда tooltip-trigger
установлено как "никогда" .
app.config(['$tooltipProvider', function($tooltipProvider){
$tooltipProvider.setTriggers({
'mouseenter': 'mouseleave',
'click': 'click',
'focus': 'blur',
'never': 'mouseleave' // <- This ensures the tooltip will go away on mouseleave
});
}]);
Примечание. $tooltip-провайдер выставляется модулем "ui.bootstrap.tooltip", и он позволяет нам глобально настраивать всплывающие подсказки в конфигурации приложения.