【问题标题】:Angular Js - Manipulate DOM and add click behaviourAngular Js - 操作 DOM 并添加点击行为
【发布时间】:2015-06-23 04:29:35
【问题描述】:

我正在使用带有角度的传单地图并添加了图例。为了改变地图的外观,我在视图加载了 $timeout-method 之后操作了 DOM。图例应该是可点击的,以选择哪些项目应该出现在地图上。因此,当单击图例中的一项时,我尝试发出警报。为此,我将项目更改为一个按钮,只是为了确定。但是按钮单击不起作用,因为它不知道方法。

有人知道如何在被操纵的 DOM 对象上调用 ng-click 方法吗?

这是我的一些代码:

controller.js

//initiating of the map happend before 
//now loading of the markers and manipulating of the map
function activate() {
    projectService.getMarkers(vm, 'projectsData');
    bindEventListener();

    $timeout( function() {
        getLegendElement();
    });
}

//manipulating of the legend element to make a button with a ng-click
function getLegendElement() {
    var element = document.getElementsByClassName("legend leaflet-control");
    element[0].children[0].innerHTML = '<button ng-click="showAlert()">ok</button>';
}

//showing the alert
$scope.showAlert = function(){
    $window.alert("foo");
}

【问题讨论】:

    标签: javascript angularjs dom click dom-manipulation


    【解决方案1】:

    您的 DOM 操作应该移到指令中。但是,如果您想将其保留在控制器中,则需要将 $compile 注入控制器并在动态生成的 html 上调用它。

    function getLegendElement() {
        var element = document.getElementsByClassName("legend leaflet-control");
        element[0].children[0].innerHTML = '<button ng-click="showAlert()">ok</button>';
        $compile(element)($scope);
    }
    

    这样做的原因是 Angular 在第一次解析你的模板时会寻找它需要生成的事件绑定。由于您正在应用一个需要绑定到最初解析模板时不存在的 html 的后期事件,因此您需要告诉 Angular 更新其对模板的理解。 documentation 指出这一点:

    $编译

    将 HTML 字符串或 DOM 编译为模板并生成模板函数,然后可用于链接范围和 模板在一起。

    【讨论】:

    • 谢谢!那行得通!我会考虑将其全部转移到指令中。
    • 很高兴为您提供帮助!将其移至指令的原因是它清除了 DOM 交互与实际业务逻辑的分离。而且由于它是推荐的 Angular 方法,它会让您更符合行业标准:)。
    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 2018-03-10
    • 1970-01-01
    相关资源
    最近更新 更多