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

时间:2015-06-21 07:18:28

标签: javascript angularjs angularjs-directive angularjs-controller

我试图编写一个会生成网格的指令。以下代码有效,但我必须指定控制器名称' 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;
    }
}
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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