I am new to angular, I have a requirement where I need to add many custom attributes to a custom element directive, <radio-button>. Currently, I am doing like this:
<radio-button one-attr="some value" two-attr="some string" three-attr="some other string"><radio-button>
I have many radio buttons on the page and writing custom attributes to each custom directive on that page looks messy. So, I am looking for an alternative where I can pass a javascript array object which loops on each radio-button custom directive.
For example: (In controller)
  $scope.values = [{
       'one-attr': 'some value',
       'two-attr': 'some other value',
       'three-attr': 'another value',
       /* and so on... */
  },
  {
       /* another custom attribute set */
  }
  /* so on */
  ]
and then to my custom directive, I will pass an custom attribute directive as shown below:
  <radio-button ng-repeat="(key, value) in values" loop-attributes="key, value"></radio-button>
Where above loop-attributes is a custom attribute directive applied to the custom element directive.
Please suggest how to do this.
If I am going wrong please suggest me how to handle this.
You would most probably have to use $compile service as radiobutton is a custom directive. You could have a parent directive which has a list of attributes and within the directive create radiobutton element with attributes and then compile it. Have used input type for example.
http://plnkr.co/edit/7ANndIuHCFaGyjWkw7sa?p=preview
// custom element
.directive('customInput', function() {
  return {
    replace: true,
    restrict: 'E',
    template: '<input type="text"></input>'
  };
})
//wrapper directive
.directive('customInputAttr', function($compile) {
  return {
    restrict: 'E',
    link: function(scope, element, attrs) {
      // This could be set even in controller
      scope.elemAttrs = [{
        'class': 'class1',
        'ng-model': 'input1'
      }, {
        'class': 'class2',
        'ng-model': 'input2'
      }];
      angular.forEach(scope.elemAttrs, function(elemAttr) {
        var customInputElem = angular.element('<custom-input></custom-input>');
        angular.forEach(elemAttr, function(value, key) {
          customInputElem.attr(key, value)
        });
      var elem = $compile(customInputElem)(scope);
      element.append(elem);
      });
    }
  };
})
                        You will want to use a directive that replaces itself with other directives.  You can see here for how to do that.  I have made a jsfiddle to show you how this works.  The repeat must be on an outer element and not the element containing the directive itself.  This is because your custom-attr directive will be parsed before the ng-repeat gets parsed, so it won't yet have a value for attr.
EDIT:  I left out an import step at the end of the link function, sorry.  This updated fiddle should work.  You need to recompile the directive to make your added ng-click directive actually function.  You also have to make sure to make the function you're binding ng-click to available to that scope, either by passing it in or by using ng-click="$parent.foo()"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With