6

Próbuję napisać dyrektywę, która wygeneruje siatkę. Poniższy kod działa, ale muszę podać nazwę kontrolera "DemoCtrl". Czy można pobrać bieżącą nazwę kontrolera z dyrektywy, dzięki czemu mogę przekazać ją do funkcji buildColumn/buildRows?Uzyskaj nazwę bieżącego kontrolera w AngularJS

angular.module('app').controller('DemoCtrl', function ($scope) { 
 
    $scope.controller = "DemoCtrl"; 
 
    $scope.coldata = [ 
 
     {name: 'Account'}, 
 
     {name: 'Name'} 
 
    ]; 
 
    $scope.rowdata = [ 
 
     { 
 
      "account": "ABC", 
 
      "name": "Jim", 
 
     }, 
 
     { 
 
      "account": "DEF", 
 
      "name": "Joe", 
 
     }, 
 
     { 
 
      "account": "GHI", 
 
      "name": "Fred", 
 
     } 
 
    ]; 
 
}); 
 

 
angular.module('foxy.components.grid', []) 
 

 
     .controller('GridController', ['$scope', '$attrs', function ($scope, $attrs) { 
 
      }]) 
 

 
     .directive('grid', function ($compile) { 
 
      return { 
 
       restrict: 'EA', 
 
       controller: 'GridController', 
 
       require: "^ngController", 
 
       scope: { 
 
        data: "=", 
 
        columns: "=", 
 
        controller: "=" 
 
       }, 
 
       link: function (scope, element, attrs, ctrl) { 
 
        scope.$watch('data', function() { 
 
         var el = $compile(buildGrid(scope.controller))(scope); 
 
         element.replaceWith(el); 
 
         element = el; 
 
        }); 
 

 
       } 
 
      }; 
 
     }) 
 

 
function buildGrid(controller) { 
 
    var html = "<table>"; 
 

 
    html += "<thead>"; 
 
    html += buildColumn(controller); 
 
    html += "</thead>"; 
 

 
    html += "<tbody>"; 
 
    html += buildRows(controller); 
 
    html +="</body>"; 
 

 
    html += "</table>"; 
 

 
    return html; 
 
} 
 
function buildColumn(controller) { 
 
    try { 
 
     var html = ""; 
 
     var dom_el = document.querySelector('[ng-controller="' + controller + '"]'); 
 
     var ng_el = angular.element(dom_el); 
 
     var ng_el_scope = ng_el.scope(); 
 
     var colname = ng_el_scope.coldata; 
 

 
     html += "<tr>"; 
 

 
     for (i = 0; i < colname.length; i++) { 
 
      html += "<th>"; 
 
      html += colname[i]["name"]; 
 
      html += "</th>"; 
 
     } 
 

 
     html += "</tr>"; 
 

 
     return html; 
 
    } catch (err) { 
 
     return "#error" + err; 
 
    } 
 
} 
 

 
function buildRows(controller) { 
 
    try { 
 
     var html = ""; 
 
     var dom_el = document.querySelector('[ng-controller="' + controller + '"]'); 
 
     var ng_el = angular.element(dom_el); 
 
     var ng_el_scope = ng_el.scope(); 
 
     var colname = ng_el_scope.coldata; 
 
     var rows = ng_el_scope.rowdata; 
 

 
     for (j = 0; j < rows.length; j++) { 
 
      html += "<tr>"; 
 

 
      for (data in rows[j]) { 
 
       html += "<td>"; 
 
       html += rows[j][data]; 
 
       html += "</td>"; 
 
      } 
 

 
      html += "</tr>"; 
 
     } 
 

 
     return html; 
 
    } catch (err) { 
 
     return "#error" + err; 
 
    } 
 
}

+1

Całkowicie niezwiązany z twoim problemem, ale powinieneś sprawdzić operację '+ ='. – m90

Odpowiedz

2

Można korzystać z usług trasy, aby uzyskać nazwę kontrolera

{{$route.current.scope.name}} 
+3

Wydaje się, że powinien to być '$ route.current.controller' – Max

1

zaktualizowałem mój kod z moim rozwiązanie, postanowiłem stworzyć nową zmienną z zakresu nazwa kontrolera, która przechodzi do funkcji buildGrid. Nie idealne, ale działa!

Powiązane problemy