Get current controller name in AngularJS

I am trying to write a directive that will generate a grid. The following code works, but I have to specify the controller name "DemoCtrl". Is it possible to get the current controller name from the directive so that I can pass it to the buildColumn / buildRows function?

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; } } 
+6
source share
2 answers

You can use your routing service to get the controller name

 {{$route.current.scope.name}} 
+2
source

I updated my code with my solution, I decided to create a new scope variable with the name of the controller, which is passed to the buildGrid function. Not perfect, but it works!

+1
source

Source: https://habr.com/ru/post/989465/


All Articles