【发布时间】:2019-02-13 10:15:17
【问题描述】:
我们的网络应用程序目前有一个可折叠的侧边菜单,其逻辑是通过一个名为 CleanZone 的外部库处理的。 加载子菜单项时会出现问题。当菜单折叠时,这些会在页面加载后附加到 DOM,导致单击事件处理程序(通过 ng-click 传递)不响应。
通常对于这样的东西,我们会创建一个指令并通过 $compile 服务将它附加到 DOM。但是在这种情况下,我需要依赖这个外部库的逻辑,它本身并不使用 AngularJS。
是否有可能以某种方式捕获这个库添加到 HTML 中的任何内容,通过 AngularJS 重新编译它,以便 ng-click 事件对其起作用?
这是帮助理解问题的代码:
DOM 始终包含这个:
<ul class="sub-menu">
<li>
<a ng-click="someFunction()" href="#">Text</a>
</li>
</ul>
如果菜单没有折叠,则显示上面的子菜单,因为它已经在 DOM 中,ng-click 才有效。
但是当菜单被折叠时,用户必须将鼠标悬停在菜单上的一个图标上,然后子菜单会被动态附加:
<div id="sub-menu-nav">
<ul class="sub-menu">
<li>
<a ng-click="someFunction()" href="#"></a>
</li>
</ul>
</div>
以下是该库如何添加元素的相关部分:
/*SubMenu hover */
var tool = $("<div id='sub-menu-nav' style='position:fixed;z-index:9999;'></div>");
function showMenu(_this, e) {
if (($("#cl-wrapper").hasClass("sb-collapsed")) {
var menu = $("ul", _this);
tool.appendTo("body");
tool.html('<ul class="sub-menu">' + menu.html() + '</ul>');
tool.show();
} else {
tool.hide();
}
}
$(".cl-vnavigation li").hover(function (e) {
showMenu(this, e);
}, function (e) {
tool.removeClass("over");
setTimeout(function () {
if (!tool.hasClass("over") && !$(".cl-vnavigation li:hover").length > 0) {
tool.hide();
}
}, 500);
});
我尝试使用指令,但它具有相同的行为,即。只有最初已经在 DOM 中的元素才会响应点击事件。
为了完整起见,指令如下:
app.directive("testAnchor", function ($compile) {
return {
restrict: "E",
replace: true,
scope: { onClick: '&' },
template: '<a href="#" ng-click="onClick({arg1: string, arg2: string})>TestText!</a>',
link: function (scope, element, attrs) {
$compile(element.contents())(scope.$new());
}
}
});
我这样称呼它:
<test-anchor on-click="myFunction(argument1, argument2)"></test-anchor>
我曾希望 AngularJS 能够编译附加的指令,但它显然不能那样工作。
那么:AngularJS 可以编译加载后由外部库附加的 HTML 吗?
【问题讨论】:
标签: javascript jquery html angularjs