在AngularJS中获取当前控制器名称

时间:2022-05-20 16:02:08

I'm 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 retrieve the current controller name from within the directive so I can pass it through to the buildColumn/buildRows functions?

我正在尝试编写一个生成网格的指令。以下代码有效,但我必须指定控制器名称'DemoCtrl'。是否可以从指令中检索当前控制器名称,以便将其传递给buildColumn / buildRows函数?

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;
    }
}

2 个解决方案

#1


2  

You could use your route service to get the controller name

您可以使用路由服务获取控制器名称

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

#2


1  

I've updated my code with my solution, I decided to create a new scope variable with the controller name which gets passed through to the buildGrid function. Not ideal, but it works!

我已经使用我的解决方案更新了我的代码,我决定使用控制器名称创建一个新的范围变量,该变量将传递给buildGrid函数。不理想,但它的工作原理!

#1


2  

You could use your route service to get the controller name

您可以使用路由服务获取控制器名称

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

#2


1  

I've updated my code with my solution, I decided to create a new scope variable with the controller name which gets passed through to the buildGrid function. Not ideal, but it works!

我已经使用我的解决方案更新了我的代码,我决定使用控制器名称创建一个新的范围变量,该变量将传递给buildGrid函数。不理想,但它的工作原理!