Angularjs dynamic directive inside ngrepeat

前端 未结 2 1450
一个人的身影
一个人的身影 2021-01-05 13:48

Look at example:

$scope.fields = [{
    name: \'Email\',
    dir : \"abc\"
}, {
    name: \'List\',
   dir : \"ffffd\"
}];

app.directive(\'abc\', function ()          


        
相关标签:
2条回答
  • 2021-01-05 14:16

    You could put this:

    <input {{p.dir}} ngmodel="p" />
    

    also in a directive. You could construct this HTML string in JavaScript and attach it to the DOM. And you would also need to compile the resulting element using the $compile service, so that the dynamic directives will be compiled.

    Some dummy sample code (not tested, but should look something like this):

    app.directive('dynamicInput', function($compile){
    return {
        link: function(scope, element){
            var htmlString = '<input ' + scope.field.dir + ' ng-model="p"/>';
            element.replaceWith(htmlString);
            $compile(angular.element(element))(scope);
        }
    }
    

    });

    More info here.

    0 讨论(0)
  • 2021-01-05 14:18

    Try this directive:

    app.directive('dynamicDirective',function($compile){
      return {
          restrict: 'A',
          replace: false, 
          terminal: true, 
          priority: 1000, 
          link:function(scope,element,attrs){
    
            element.attr(scope.$eval(attrs.dynamicDirective),"");//add dynamic directive
    
            element.removeAttr("dynamic-directive"); //remove the attribute to avoid indefinite loop
            element.removeAttr("data-dynamic-directive");
    
            $compile(element)(scope);
          }
      };
    });
    

    Use it:

    <table class="table table-hover">
       <tr ng-repeat="p in people">
          <td dynamic-directive="p.dir" blah="p"></td>
       </tr>
    </table>
    

    DEMO

    For more information on how this directive works and why we have to add terminal:true and priority: 1000. Check out Add directives from directive in AngularJS

    0 讨论(0)
提交回复
热议问题