如何动态添加ng-click处理程序

时间:2015-12-28 18:12:31

标签: angularjs dynamic angularjs-ng-click

我尝试在之前生成的按钮上添加ng-click(动态),但效果不佳。此外,我已尝试在此论坛上找到的所有解决方案,没有人运作良好。

我的HTML代码:

<body class="max_height" ng-app="myApp">
    <div class="container max_height" ng-controller="myCtrl">
        <div id="play" tabindex="0" ng-init="init()" ng-keydown="keyDown($event)">
            {{ content }}
        </div>
    </div>

    <script src="js/angular.min.js"></script>
    <script src="js/script.js"></script>
</body>

我的AngularJS代码:

var app = angular.module("myApp", []);
app.controller("myCtrl", function($scope, $compile) {
  $scope.init = function() {
    var el = '<button class="btn" id="start" data-ng-click="startAnimation()">Start</buttom>';
    var element = angular.element(document.querySelector('#play'));
    var generated = element.html(el);
    $compile(generated)($scope);
}
$scope.startAnimation = function(){
        console.log("click");
}
});

我的错误是&#34; RangeError:超出最大调用堆栈大小&#34;这是由$ compile(生成)($ scope)生成的; 。另一个问题来自于第一个问题,如果我点击一下按钮,那么函数startAnimation将会执行数百次。

请给我一个解决方案。错误在哪里。

2 个答案:

答案 0 :(得分:8)

问题在于这行代码:

$compile(generated)($scope);

相反它应该是:

$compile(generated.contents())($scope);

答案 1 :(得分:1)

您可以将该功能分配给范围变量,并根据您的业务逻辑为您的ng-click分配适当的功能。在下面的示例中,$ scope.addGeoFence()被添加到&#34;添加地理栅栏&#34;的ng-click中。列表项

$scope.layout = [
      {name: 'Home', icon: 'home'},
      {name: 'Add Geofence', 
       icon: 'add_location', 
       click: $scope.addGeoFence}
];

$scope.addGeoFence = function() {
    console.log("calling addGeoFence()");
}

<md-list>
    <md-list-item ng-repeat="snav in layout">
        <md-button class="md-raised" ng-click="(snav.click)()" flex>
            <md-icon md-font-library="material-icons">{{snav.icon}}
            </md-icon>
            <span>{{snav.name}}</span>
        </md-button>
    </md-list-item>
</md-list>