AngularUI modal можно перетаскивать и изменять размер
У меня есть модальное окно angularUi, заключенное в директиву:
HTML:
<!doctype html>
<html ng-app="plunker">
<head>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.8/angular.js"></script>
<script src="http://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.10.0.js"></script>
<script src="main.js"></script>
<link href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div my-modal="{ data: 'test2'}">test2</div>
</body>
</html>
JavaScript:
angular.module('plunker', ['ui.bootstrap', 'myModal']);
angular.module("myModal", []).directive("myModal", function ($modal) {
"use strict";
return {
template: '<div ng-click="clickMe(rowData)" ng-transclude></div>',
replace: true,
transclude: true,
scope: {
rowData: '&myModal'
},
link: function (scope, element, attrs) {
scope.clickMe = function () {
$modal.open({
template: "<div>Created By:" + scope.rowData().data + "</div>"
+ "<div class=\"modal-footer\">"
+ "<button class=\"btn btn-primary\" ng-click=\"ok()\">OK</button>"
+ "<button class=\"btn btn-warning\" ng-click=\"cancel()\">Cancel</button>"
+ "</div>",
controller: function ($scope, $modalInstance) {
$scope.ok = function () {
$modalInstance.close({ test: "test"});
};
$scope.cancel = function () {
$modalInstance.dismiss('cancel');
};
}
});
}
}
};
});
plunker: http://plnkr.co/edit/yzxtWwZQdq94Tagdiswa?p=preview
Я хочу сделать modal draggable и resizable. Я искал через Интернет и смог найти следующее решение для реализации draggable:
http://plnkr.co/edit/jHS4SJ?p=preview
Это важная часть:
app.directive('dragable', function(){
return {
restrict: 'A',
link : function(scope,elem,attr){
$(elem).draggable();
}
}
});
но не смог заставить его работать с моим примером. Может кто-то помочь мне с этим? Интересно, можно ли использовать jqueryui modal в директиве (вместо бутстрапа)? Я не очень хорошо разбираюсь в javascript и очень приветствую любой рабочий пример с обоими параметрами. Благодаря
EDIT:
Я добавил ссылку jqueryui и сумел сделать modal draggable, добавив эту строку:
$(".modal-dialog").draggable();
Проблема в том, что я не уверен, когда добавлять эту строку. В тот момент, когда я добавил это в методе отмены (просто для его работы):
$scope.cancel = function() { . $( "Модальная диалог" ) перетаскиваемая(); };
Итак, когда модаль открыт, мне нужно вызвать отмену, и только тогда модаль перетаскивается. Если я назову это раньше, то .modal-dialog не существует. Предложения?
обновленный плункер:
http://plnkr.co/edit/yzxtWwZQdq94Tagdiswa?p=preview
Мне не хватает чего-то маленького, может ли кто-нибудь предоставить рабочий пример?
Ответы
Ответ 1
Я создал собственную директиву, чтобы сделать модальное перетаскивание. Вам нужны только AngularJs и jQuery. Директива использует класс "модальный диалог" из Ui-Bootstrap modal, и вы можете перемещать только модальный код в заголовке.
.directive('modalDialog', function(){
return {
restrict: 'AC',
link: function($scope, element) {
var draggableStr = "draggableModal";
var header = $(".modal-header", element);
header.on('mousedown', (mouseDownEvent) => {
var modalDialog = element;
var offset = header.offset();
modalDialog.addClass(draggableStr).parents().on('mousemove', (mouseMoveEvent) => {
$("." + draggableStr, modalDialog.parents()).offset({
top: mouseMoveEvent.pageY - (mouseDownEvent.pageY - offset.top),
left: mouseMoveEvent.pageX - (mouseDownEvent.pageX - offset.left)
});
}).on('mouseup', () => {
modalDialog.removeClass(draggableStr);
});
});
}
}
});
Ответ 2
Если вы не хотите изменять встроенные шаблоны, вы можете написать директиву, которая нацелена на modalWindow
:
.directive('modalWindow', function(){
return {
restrict: 'EA',
link: function(scope, element) {
element.draggable();
}
}
});
Обратите внимание, что вам придется загружать как jQuery, так и jQuery UI перед скриптами AngularJS.
ПРИМЕЧАНИЕ. Также имейте в виду, что более новые версии Angular UI bootstrap были префиксами "uib", поэтому "modalWindow" становится "uibModalWindow" благодаря @valepu
Ответ 3
Я объединил два вышеупомянутых ответа и сделал мой способный переносить.
.directive('modalWindow', function(){
return {
restrict: 'EA',
link: function(scope, element) {
$(".modal-dialog").draggable();
}
}
});
Ответ 4
Спасибо за ваши примеры. Я немного отполировал ваш код, и это мой окончательный результат. для моего решения он отлично работает: -)
HTML:
<div class="draggableModal ui-widget-content">
<div class="modal-header">
...
</div>
</div>
angular.module('posProductsManager').directive('modalDialog', function () {
var definition = {
restrict: 'AC',
link: function ($scope, element) {
var draggableStr = "draggableModal";
var header = $(".modal-header", element);
var modalDialog = element;
var clickPosition = null;
var clickOffset = null;
header[0].addEventListener('mousedown', function (position) {
clickPosition = position;
clickOffset = position;
window.addEventListener('mouseup', mouseUpEvent);
window.addEventListener('mousemove', mouseMoveEvent);
});
function mouseUpEvent() {
clickPosition = null;
window.removeEventListener('mouseup', mouseUpEvent);
window.removeEventListener('mousemove', mouseMoveEvent);
}
function mouseMoveEvent(position) {
var offset = modalDialog.parents().offset();
$("." + draggableStr, modalDialog.parents()).offset({
left: clickPosition.pageX + (position.pageX - clickPosition.pageX) - clickOffset.offsetX,
top: clickPosition.pageY + (position.pageY - clickPosition.pageY) - clickOffset.offsetY,
});
clickPosition = position;
}
}
};
return definition;
});
Ответ 5
a Angular UI modal с перетаскиваемой заголовкой
ПРИМЕЧАНИЕ. Необходимо загружать как jQuery, так и jQuery UI перед скриптами AngularJS.
angular.module('xxApp')
.directive('uibModalWindow', function () {
return {
restrict: 'EA',
link: function (scope, element) {
$('.modal-content').draggable({handle: ".modal-header"});
}
}
});