Angular指令可以编译ng-click元素

时间:2016-04-29 09:00:43

标签: angularjs angularjs-directive angularjs-compile

我写了一个指令,它将使用ng-click指令渲染子元素,这是我的代码:

指令

angular.module('myApp')
  .directive('popover', [
    '$compile',
    function($compile) {
      return {
        scope: {
          items: "=",
        },
        link: function($scope, $element, $attrs){
          $.each($scope.items, function(key, value) {
            var item = '<a ng-click="'+value.ngClick+'">'+value.name+'</a>';
            $element.append($compile(item)($scope));
          });
        }
      }
    }
  ]
);

TEMPLATE

<div popover items="myItems"></div>

CONTROLLER

angular.module('myApp')
  .controller('MyCtrl', [
    '$scope',
    function ($scope) {

      $scope.myItems = [
        {name: 'Do this', ngClick: 'doThis()' },
        {name: 'Do that', ngClick: 'doThat()' },
      ];

      $scope.doThis = function() { console.log('this is done') };
      $scope.doThat = function() { console.log('that is done') };

    }
  ]
);

rendring工作正常,我得到一个A元素列表,右键属性点击它,但函数doThis()和doThat()永远不会被触发

我认为问题是在$ compile命令附近,但是我已经在其他上下文中使用了这个命令,它似乎工作正常。此外,在Chrome开发工具栏中,我看不到与元素的ng-click指令相关的事件。

有什么想法吗? 感谢

1 个答案:

答案 0 :(得分:3)

你的指令有一个孤立的范围所以doThis和doThat不是指令的范围。要么删除隔离范围,要么可以通过这样的函数:

app.controller('MainCtrl', function($scope) {
  $scope.myItems = [
        {name: 'Do this', ngClick: doThis },
        {name: 'Do that', ngClick: doThat },
      ];

      function doThis() { console.log('this is done') };
      function doThat() { console.log('that is done') };
});

app
  .directive('popover', function($compile) {
      return {
        scope: {
          items: "=",
        },
        link: function($scope, $element, $attrs){
          $scope.clickFunctions = {};
          $.each($scope.items, function(key, value) {
            $scope.clickFunctions[value.name] = value.ngClick
            var item = '<a ng-click="clickFunctions[\''+value.name+'\']()">'+value.name+'</a>';
            $element.append($compile(item)($scope));
          });
        }
      }
    }
);

请参阅this plunker了解演示。