使用ng-click动态添加指令

时间:2014-08-11 21:03:02

标签: angularjs angularjs-directive

我正在为客户制作模态。我已经创建了一个工作得很好的指令,问题是每次使用它时都会提前一个模态...

我有什么

<div ng-repeat="item in items">
  <a data-toggle="modal" data-target="{{item.id}}">Click</a>
  <my-dialog element-id="item.id">
    <h1>This is the body of the modal</h1>
  </my-dialog>
</div>

这适用于少量模态,但我们使用了大量的模态。所以我想在运行时添加指令,更接近......

我想要的......

<div id="warning"></div>
<div ng-repeat="item in items">
  <a data-toggle="modal" data-target="{{item.id}}" ng-click="showModal(item)">Click</a>
</div>
...
// inside controller
$scope.showModal = function(item){
  $http.get('/someUrl').success(function(data){
    var result = $compile('<my-dialog element-id="'+item.id+'">'+data+'</my-dialog>').($scope);
    $("#warning").append(result);
  });
}
$scope.hideModal = function(){
  $( "#warning" ).empty();
}

这当然不起作用。它也不是最好的方式。这将允许我在指令关闭后删除它。

请提供支票或等效物品。

2 个答案:

答案 0 :(得分:1)

您可以这样做的一种方法是对项目使用ng-repeat,然后在将新项目推送到列表后调用$ scope。$ apply()。 HTML可能看起来像这样......

<div ng-repeat="item in items">
  <span dialog>
    <a class="dialog-anchor">{{item.name}}</a>
    <div class="dialog-body">{{item.id}}</div>
  </span>
</div>

......和这样的指令

.directive('dialog', [function () {
    return {
    scope: {
    id: '@elementId',
  }
  , link: function (scope, el, attrs) {
    var body = $(el).find('.dialog-body').detach();
    $(el).find('.dialog-anchor').on('click', function () {
      $('body').append(body);
    });
  }};
  }])

......和这样的控制器

.controller('app', ['$scope', function ($scope) {
  $scope.items = [
    {name: 'first', id: 001},
    {name: 'second', id: 002}
  ];

  setTimeout(function () {
    $scope.items.push({name: 'three', id: 003});
    if (!$scope.$$phase) $scope.$apply();
  }, 2000);  
}])

这里的掠夺者...... http://plnkr.co/edit/2ETbeCKGcHW3CJCfD9d7?p=preview。您可以在setTimeout中看到$ scope。$ apply调用,我将新项目推送到数组。

答案 1 :(得分:0)

试试这个:

 var result = $compile('<my-dialog element-id="'+item.id+'">'+data+'</my-dialog>')($scope);