드래그 & Drop in Angular 구현에 대한 훌륭한 자습서를 따라 갔는데 원래는 this StackOverflow answer이라는 작가의 블로그와 GitHub 코드에 링크되어 있습니다. 나는 그것을 구현하고 내 프로젝트에서 그것을 시험 할 때AngularJS의 지시어에 DOM 함수를 보내는 방법은 무엇입니까?
, 나는 오류 가지고 :
[$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
속성이 지침 lvlDropTarget
에, 내 컨트롤러에 정의되어이 dropped
기능 (통과 (아래 게시)는 사용자가 만든 드래그 앤 드롭 동작을 수행하도록 호출합니다. 이 디자인은 같은 앱에서 다양한 드래그 드롭 가능성에 대한 지시를 재사용 할 수 있기 때문에 마음에 듭니다. 필자는 컨트롤러에 다른 함수를 정의하고 on-drop
속성을 통해 지시문에 전달하기 만하면됩니다.
그러나 이것은 불행히도 Angular에 의해 격추 된 것으로 보입니다. 다른 사람이 동일한 디자인과 기능을 달성하는 방법에 관해서는 어떤 다른 방법이 있습니까? 그렇지만 Angular가 더 괜찮습니까? 여기
이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도 사용하고 있습니까? 이것은 오류의 원인 일 수 있습니다. –