【发布时间】:2015-01-10 15:05:58
【问题描述】:
我正在关注一个关于在 Angular 中实现拖放的精彩教程,我最初在 this StackOverflow answer 中找到了该教程,该教程链接到作者的博客和 GitHub 代码。
当我实现它并在我的项目中测试它时,我得到了错误:
[$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 属性将其传递给指令。
但是,不幸的是,这似乎已被 Angular 击落。有没有人知道如何实现同样的设计和功能,但在某种程度上 Angular 更适合?
这是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");
});
}
}
}
]);
【问题讨论】:
-
我开始了赏金,因为我在互联网上找不到任何关于它的答案。
-
你也在使用 jQuery。这可能是错误的原因。
标签: angularjs dom angularjs-directive parse-error