#angularjs #angular-ui-bootstrap
#angularjs #angular-ui-bootstrap
Вопрос:
Я хотел бы, чтобы всплывающее окно при наведении курсора мыши отображалось только при наведении курсора мыши на элемент на экране. В настоящее время я использую $modal для модалов и подумал, может быть, я мог бы его использовать. Проблема, с которой я сталкиваюсь, заключается в том, что я не уверен, как заставить modal исчезнуть, когда я больше не над элементом страницы. В модальном не требуется никаких действий, я просто хочу, чтобы оно появлялось, когда я нахожусь над элементом, и исчезало, когда я удаляюсь от элемента.
Вот мой plunkr: http://plnkr.co/edit/3vWVRA0CM7vrMugImgmX?p=preview
Вот пример того, что я ищу с помощью jQuery: http://www.sundoginteractive.com/sunblog/posts/jquery-hover-box
var myApp = angular.module('myApp', ['ui.bootstrap']);
myApp.controller('myCtrl', ['$modal', '$scope', '$log',
function ($modal, $scope, $log) {
$scope.option = {
name: 'Name (hover over for more details)',
longDescription: 'This is my detailed description... lots of text here'
}
$scope.showOptionDetails = function(option) {
$log.info($scope.option);
$scope.optionModal = $modal.open({
template: '<div class="modal-header"><h3 class="modal-title">Option</h3></div><div class="modal-body">{{option.longDescription}}</div><div class="modal-footer"></div>',
controller: 'modalCtrl',
resolve: {
option: function() {
return $scope.option;
}
}
});
}
$scope.closeOptionDetails = function() {
$scope.optionModal.close();
}
}
]);
myApp.controller('modalCtrl', [
'$modalInstance', '$scope', '$log', 'option', function ($modalInstance, $scope, $log, option) {
$log.info(option);
$scope.option = option;
}
]);
Комментарии:
1. Причина, по которой событие выхода мыши не запускается, заключается в том, что
ng-mouseleave="closeOptionDetails"
должно бытьng-mouseleave="closeOptionDetails()"
. Но вы все равно не получите желаемого поведения, поскольку модальное исчезает, как только оно создается. Будет ли всплывающее окно соответствовать вашим потребностям?2. Да, я думаю, что всплывающее окно удовлетворит мои потребности. Некоторые из них могут быть сложными, хотя с несколькими полями длинного текста и изображения. Могу ли я использовать шаблон с всплывающим окном?
3. Я отказался от всплывающего окна с html-шаблоном. Слишком много примеров в Интернете, которые просто не работают. Думаю, мне придется потребовать от пользователей нажать кнопку и получить традиционный модальный.
Ответ №1:
Большое спасибо, чувак — это именно то, что я искал!
Проблема заключалась в том, что ng-mouseleave был в неправильном месте и с неправильным контроллером. В модальном контроллере вам нужно специально создать функцию для вызова $modalInstance.close() .
Я взял на себя смелость добавить кнопку закрытия (чтобы кто-то мог намеренно закрыть модель, если захочет, но вы можете ее удалить. Mouseleave определенно работает!)
var myApp = angular.module('myApp', ['ui.bootstrap']);
myApp.controller('myCtrl', ['$modal', '$scope', '$log',
function ($modal, $scope, $log) {
$scope.option = {
name: 'Name (hover over for more details)',
longDescription: 'This is my detailed description... lots of text here'
}
$scope.showOptionDetails = function(option) {
$log.info($scope.option);
$scope.optionModal = $modal.open({
template: '<div class="modal-header" ng-mouseleave="close()"><h3 class="modal-title">Option</h3></div><div class="modal-body">{{option.longDescription}}</div><div class="modal-footer" ng-click="close()">Close</div>',
controller: 'modalCtrl',
resolve: {
option: function() {
return $scope.option;
}
}
});
}
$scope.closeOptionDetails = function() {
$scope.optionModal.close();
}
}
]);
myApp.controller('modalCtrl', [
'$modalInstance', '$scope', '$log', 'option', function ($modalInstance, $scope, $log, option) {
$log.info(option);
$scope.option = option;
$scope.close = function() {
$modalInstance.close();
}
}
]);
Вы можете увидеть, как это работает здесь: http://plnkr.co/edit/3KiZdZsxwy6GDLoy6DhV?p=preview
Комментарии:
1. Приветствую! Было полезно освежить в памяти угловые движения мыши и область действия. Думаю, мне лучше проверить, что исправит angular 2, и сломать…