Я внимательно следил за реализацией Drag & Drop in Angular, который я нашел изначально в this StackOverflow answer, который ссылается на блог писателя и код GitHub.Как отправить функцию DOM в директиву в AngularJS?
Когда я реализовал его и протестировал его в моем проекте, я получил ошибку:
[$parse:isecdom] Referencing DOM nodes in Angular expressions is disallowed! Expression: dropped(dragEl, dropEl)
According to Angular Docs, проблема в том, что я ссылку на функции, которая принимает объекты DOM в качестве параметров внутри DOM атрибутов - это что происходит в этой строке:
<div x-lvl-drop-target='true' x-on-drop='dropped(dragEl, dropEl)'>drop zone</div>
Как вы можете видеть, атрибут on-drop
проходит эту dropped
функции (которая определена в моем контроллере, к директиве lvlDropTarget
(размещен ниже), который называет его действием действия перетаскивания, которое делает пользователь. Мне нравится этот дизайн, так как он делает директиву многократной для множества различных возможностей перетаскивания в том же приложении. По сути, мне просто нужно определить другую функцию в моем контроллере и передать ее в директиву через атрибут on-drop
.
Однако, к сожалению, это, похоже, было сбито угловым. Есть ли у кого-нибудь какие-либо вопросы относительно того, как достичь такого же дизайна и функциональности, но в некотором смысле Угловая - это лучше?
Вот lvlDropTarget
директивы
module.directive('lvlDropTarget', ['$rootScope', 'uuid',
function ($rootScope, uuid) {
return {
restrict: 'A',
scope: {
onDrop: '&'
},
link: function (scope, el, attrs, controller) {
var id = angular.element(el).attr("id");
if (!id) {
id = uuid.new()
angular.element(el).attr("id", id);
}
el.bind("dragover", function (e) {
if (e.preventDefault) {
e.preventDefault(); // Necessary. Allows us to drop.
}
if (e.stopPropagation) {
e.stopPropagation();
}
e.dataTransfer.dropEffect = 'move';
return false;
});
el.bind("dragenter", function (e) {
angular.element(e.target).addClass('lvl-over');
});
el.bind("dragleave", function (e) {
angular.element(e.target).removeClass('lvl-over'); // this/e.target is previous target element.
});
el.bind("drop", function (e) {
if (e.preventDefault) {
e.preventDefault(); // Necessary. Allows us to drop.
}
if (e.stopPropogation) {
e.stopPropogation(); // Necessary. Allows us to drop.
}
var data = e.dataTransfer.getData("text");
var dest = document.getElementById(id);
var src = document.getElementById(data);
scope.onDrop({
dragEl: src,
dropEl: dest
});
});
$rootScope.$on("LVL-DRAG-START", function() {
var el = document.getElementById(id);
angular.element(el).addClass("lvl-target");
});
$rootScope.$on("LVL-DRAG-END", function() {
var el = document.getElementById(id);
angular.element(el).removeClass("lvl-target");
angular.element(el).removeClass("lvl-over");
});
}
}
}
]);
Я начал щедрость, так как я не могу найти ответа в Интернете об этом. – Cleiton
Вы тоже используете jQuery. Это может быть причиной ошибки. –