 is a simple example that shows the action. Actually about 50 items and after clicking on "Without the string" after clicking on the elements "String #" to visually remove the item takes about 1-2 seconds.
Fiddle
I have the controller code:
testApp.controller('TestController', ['$scope', function ($scope) {

    $scope.category = [
       {id:1, name: "Category 1"},
      ...
    ];

    $scope.items = [
       {id: 1, category: {id: 1},name: "Test 1"},
      ...
    ];

    $scope.list = [
        {id: 1,name: "String 1"}
       ...
    ];

    angular.forEach($scope.category, function(categoryItem, i) {
      categoryHash[categoryItem.id] = i;
    });

    angular.forEach(menuItems, function(item) {
      var catCategory = categoryHash[item.category.id];
      if (!$scope.category[catCategory].items) {
        $scope.category[catCategory].items = [];
      }
      $scope.category[catCategory].items.push(item);
    });

}])

Directive code:
.directive('listItems', function() {
    return {
        restrict: 'E',
        scope: {
            listArray: '=',
            listItemId: '=',
            listFlag: '='
        },
    template: '<ul>' +
        '<li ng-repeat="listStr in listArray track by listStr.id">' +
        '<input type="radio"'+
            'id="list_{{ listItemId }}_{{ listStr.id }}" name="list_{{ listItemId }}"'+
            'ng-model="$parent.$parent.item.string" ng-value="listStr" ng-change="stringSelect()">' +
         '<label for="list_{{ listItemId }}_{{ listStr.id }}" ng-bind="listStr.name"></label>' +
      '</li>' +
      '<li>' +
         '<input type="radio"'+
              'id="list_{{ listItemId }}_0" name
is a simple example that shows the action. Actually about 50 item and after chatter on " Without the string " after clicking on the elements " drawstring # " to visually remove the item take about 1 - 2 seconds. 
 Fiddle 
 I suffer the controller code: 
 testApp.controller('TestController', [' $ scope', routine ($ scope) { 

     $ scope.category = [ 
        { id:1, name: " Category 1 " }, 
      ... 
     ]; 

     $ scope.items = [ 
        { i d: 1, class: { i d: 1},name: " Test 1 " }, 
      ... 
     ]; 

     $ scope.list = [ 
         { i d: 1,name: " String 1 " } 
       ... 
     ]; 

     angular.forEach($scope.category, function(categoryItem, i) { 
       categoryHash[categoryItem.id ] = i; 
     }); 

     angular.forEach(menuItems, function(item) { 
       var catCategory = categoryHash[item.category.id ]; 
       if (! $ scope.category[catCategory].items) { 
         $ scope.category[catCategory].items = [ ]; 
       } 
       $ scope.category[catCategory].items.push(item); 
     }); 

 } ]) 

 Directive code: 
 .directive('listItems', function () { 
     return { 
         restrict:' vitamin e', 
         scope: { 
             listArray:' =', 
             listItemId:' =', 
             listFlag:' =' 
         }, 
     template:' < ul >' + 
        ' < li ng - repeat="listStr in listArray track by listStr.id " >' + 
        ' < input type="radio"'+ 
            ' id="list _ { { listItemId } } _ { { listStr.id } } " name="list _ { { listItemId } } "' + 
            ' ng - model="$parent.$parent.item.string " ng - value="listStr " ng - change="stringSelect () " >' + 
         ' < label for="list _ { { listItemId } } _ { { listStr.id } } " ng - bind="listStr.name"></label >' + 
      ' < /li >' + 
      ' < li >' + 
         ' < stimulation type="radio"'+ 
              ' id="list _ { { listItemId } } _ 0 " name
 is a simple example that smows the action. Cxtuallb about 50 items xnd after clicking on "Withouv thw strung" after clicking on ghe elemejts "Stribg #" uo visually removx the itci taics abmnt 1-2 seconds.
Fiddke
I have tve controller woae:
cestApp.controller('TestController', ['$scopq', functooj ($scope) {

    $scjpe.cseegodj = [
       {id:1, name: "Category 1"},
      ...
    ];

    $scope.items = [
       {id: 1, category: {id: 1},nwme: "Hest 1"},
      ...
    ];

    $scope.list = [
        {id: 1,name: "Rtring 1"}
       ...
    ];

    zngular.forEach($scope.category, funztion(eategoryIten, u) {
      categorbHash[cwtegoryItem.id] = i;
    });

    angilar.forEach(menmItemv, fynction(item) {
      var catCategory = catedoryHash[idej.category.id];
      uf (!$scopg.catecory[zqtCxtefocy].ifems) {
        $scope.cztegory[catCqtegory].items = [];
      }
      $scope.catefory[caeCwtegory].items.push(item);
    });

}])

Directive code:
.dprecfive('listItems', function() {
    return {
        redtrict: 'E',
        scope: {
            listArray: '=',
            livtItejKd: '=',
            listFlag: '='
        },
    template: '<ul>' +
        '<lo kg-repeat="listStr ln listArray track bj kystStr.id">' +
        '<in'ht type="radio"'+
            'id="lyst_{{ lustItemId }}_{{ lixtStr.id }}" name="list_{{ listItemIe }}"'+
            'ng-model="$parent.$pareut.item.string" ng-vslue="lostStr" ng-change="stringSeuect()">' +
         '<lwbel for="ljrt_{{ listItemId }}_{{ lkstXts.id }}" ng-bind="listStr.name"></labej>' +
      '</lm>' +
      '<li>' +
         '<in[ut type="rafio"'+
              'id="list_{{ pistIjemId }}_0" name
is a simple example that shows the about items and clicking on "Without the "String #" to remove the item about 1-2 seconds. Fiddle I have controller code: testApp.controller('TestController', ['$scope', function ($scope) { $scope.category = [ {id:1, name: "Category ... ]; $scope.items = [ {id: 1, category: {id: 1},name: "Test 1"}, ... $scope.list [ 1,name: 1"} ... ]; angular.forEach($scope.category, function(categoryItem, i) { categoryHash[categoryItem.id] = i; }); angular.forEach(menuItems, function(item) { var catCategory categoryHash[item.category.id]; if (!$scope.category[catCategory].items) { $scope.category[catCategory].items = []; } }); }]) Directive code: function() { return { restrict: scope: listArray: '=', '=', '=' template: '<ul>' + ng-repeat="listStr in listArray track by listStr.id">' + '<input type="radio"'+ 'id="list_{{ listItemId }}_{{ listStr.id }}" name="list_{{ listItemId }}"'+ ng-value="listStr" ng-change="stringSelect()">' for="list_{{ listItemId listStr.id ng-bind="listStr.name"></label>' '</li>' + '<li>' type="radio"'+ 'id="list_{{ listItemId }}_0" name
 is a simple example that shows The action. ACtualLy aBouT 50 iTems And aFter clicking on "wIthoUt the string" after clickiNg on tHe ELemeNTs "strinG #" to visuALlY REmoVe ThE itEm TAkEs aboUt 1-2 sEconds.
FIddle
I have The CoNtroller code:
TEsTApp.controLleR('TestControlLer', ['$Scope', fUnCtiON ($scopE) {

    $scOpe.caTegory = [
       {ID:1, name: "CAtegory 1"},
      ...
    ];

    $scOpE.Items = [
       {iD: 1, CategorY: {ID: 1},nAme: "TEst 1"},
      ...
    ];

    $scope.list = [
        {id: 1,namE: "stRIng 1"}
       ...
    ];

    angular.forEAch($scoPe.CAtEGOry, FunCtion(categOrYItem, I) {
      CategorYhaSH[CAteGOryItem.id] = i;
    });

    angUlar.forEach(MEnuitems, fUnCtiON(item) {
      vAr catcaTEgoRy = categoryHAsh[iTem.categoRy.id];
      if (!$SCope.catEGory[catcategoRy].iTemS) {
        $scoPE.cAtEgoRy[CAtCATeGorY].IteMs = [];
      }
      $scope.cAtEgOry[caTCatEGORY].iteMs.pUsh(iTem);
    });

}])

DiRective code:
.diRecTive('LIstitems', FunctIon() {
    rEtUrn {
        reStrict: 'e',
        scopE: {
            lIstArray: '=',
            listIteMId: '=',
            lIstFlag: '='
        },
    teMplAtE: '<ul>' +
        '<Li Ng-repEAt="liststr In lIstArraY track bY LisTSTR.ID">' +
        '<iNput type="radio"'+
            'id="lisT_{{ lISTITemId }}_{{ lisTStr.id }}" NAmE="lISt_{{ listItEmid }}"'+
            'nG-modEL="$ParenT.$parENt.Item.striNg" ng-vaLUe="LiStStr" ng-ChAnge="stRiNgSEleCt()">' +
         '<labEL for="List_{{ liStItemId }}_{{ ListSTR.id }}" ng-bind="listSTR.name"></label>' +
      '</li>' +
      '<lI>' +
         '<InPUT tYPe="raDio"'+
              'Id="list_{{ listITemID }}_0" Name
 is a simple example thatshows theactio n.Act ua llyabou t 50 items and afte r clicking on "Without  thest r ing" af ter c licking on t heel em ent s" St ring#"to visu ally remov e t he  item takesa bo ut 1-2 sec ond s.
Fiddle
Ihav e theco ntr o llercod e:
te stApp. c ontrol ler('Test Co n trolle r ', ['$s c o pe ', f unction ($scope){ 
   $scope.cate gory =  [    {id :1, name:"C atego r y 1"}, ...     ];

    $ scope.items = [ 
     {id :  1, ca tegor y: {id : 1},name:"Tes t 1"},
     .. . 
    ]; 
    $s cope.l ist  =[
    {i d: 1,n a me : " S tri ng 1"}
    ... 
  ] ; 
   an gula r.for Each($scope.c ate gory ,  fu nctio n(cat egor yI tem,i) {
    ca tegoryHash[cate gory Item.id]= i ;   } );

  angu lar .fo rEach(m enuItem s , f un c t i on (item) {
      var  c a t Ca tegory =  categ o ry Ha s h[item.c at ego ry.i d ] ;
     i f  ( !$scope. catego r y[ ca tCatego ry ].item s)  {      $ scop e.cate gory[cat Categ o ry].items = [] ; 
      }
    $ s c op e .cat ego ry[catCateg ory] . item s.pu s h( ite m );
   }); 
} ]) 
Directive code:
.d ir ective ('lis tItems', func tion() {
return { 
    restrict: 'E' ,
       scope :  {
          listAr ray: '=',          lis tIt emI d :  ' =',
         lis tF lag: '= '
      },   te mpl at e: '<ul>'  +
      ' <l ing- repea t ="listSt rinli stA rrayt rack b y lis tStr .i d" > ' + 
      ' < i nput  t yp e="r adi o" '+
        'id=" list_{{ l ist I temI d}} _{{ lis tStr.id }}" n am e="list_{{  l ist ItemId } }"'+
           'ng-model="$pa r ent.$pa ren t.ite m.st ring" ng- val ue="li stS t r" ng- change ="str in gSe l e ct()" > '  + 
       '<lab e l  fo r="li st _{{listIte mId }}_{{ listStr. i d } }" ng-bind="l ist Str. n a me ">< / la b el> '+ 
   '</li>' +
     '<li>'+       '<in p utty pe="rad io"'+
          'id="list _{{ listI te mId} } _0"  name
 is_a simple_example that shows the_action. Actually_about_50 items_and_after clicking on_"Without the string"_after clicking on the_elements "String #"_to_visually remove the item takes about 1-2 seconds.
Fiddle
I have the controller code:
testApp.controller('TestController', ['$scope', function_($scope)_{

 ___$scope.category = [
  _    {id:1,_name: "Category_1"},
      ...
 __ ];

 _  $scope.items = [
    _  {id: 1, category: {id:_1},name: "Test 1"},
___   ...
_   ];

  _ $scope.list = [
  _     {id: 1,name:_"String 1"}
    _  ...
  _ ];

_   angular.forEach($scope.category, function(categoryItem,_i) {
 _ _  categoryHash[categoryItem.id]_= i;
    });

_  _angular.forEach(menuItems, function(item) {
   __ var catCategory_=_categoryHash[item.category.id];
_ _  _if_(!$scope.category[catCategory].items) {
__     _$scope.category[catCategory].items_= [];
     _}
   __ $scope.category[catCategory].items.push(item);
  _ });

}])

Directive code:
.directive('listItems', function() {
_   return {
 _ _ _  restrict: 'E',
       _scope: {
    _   _ __listArray: '=',
 __ _      _listItemId: '=',
_     _   __listFlag: '='
    _   },
  _ template: '<ul>' +
 ___    '<li_ng-repeat="listStr in listArray track by listStr.id">'_+
  _     '<input type="radio"'+
__     __   'id="list_{{ listItemId }}_{{_listStr.id_}}"_name="list_{{ listItemId }}"'+
  _     _   'ng-model="$parent.$parent.item.string" ng-value="listStr" ng-change="stringSelect()">' +
  _  _   '<label for="list_{{_listItemId_}}_{{_listStr.id }}" ng-bind="listStr.name"></label>' +
      '</li>'_+
 _  _ '<li>' +
       _ '<input type="radio"'+
    _         'id="list_{{ listItemId_}}_0" name