如何在不重写父作用域的情况下将参数传递给指令?

Geo*_*pty 10 javascript angularjs angularjs-scope angularjs-ng-repeat angular-directive

我需要创建一个指令,该指令作用于表格单元格,其中使用表格行进行渲染ng-repeat- 为此,我部分地依赖于对题为"在ng-repeat完成时调用函数"的问题的答案.然而,与Q&A不同,我需要向我的指令传递一个参数,为此我部分依赖于这个答案(对于一个题为"Angularjs - 将参数传递给指令"的问题).

所以在我的情况下,我已经添加fixed-column-tooltip了我的指令,并columnselector作为其参数<tr>如下:

<tr fixed-column-tooltip columnselector=".td-keyField" ng-repeat="trData in trDataWatch">
Run Code Online (Sandbox Code Playgroud)

但是根据第二个答案,我将我所学到的内容添加到我的指令"隔离范围"中,根据第一个答案我不再能够访问原始范围:

'use strict';

angular.module('cmt.cases.directives')

.directive('fixedColumnTooltip', function ($timeout) {
    return {
        restrict: 'A',
        scope: {
            columnselector: '@'
        },
        link: function (scope, element, attr) {
            if (scope.$last === true) { //undefined because not operating on original scope
        ...
Run Code Online (Sandbox Code Playgroud)

有没有办法保持对原始范围的访问,但也有权访问columnselector参数?

Geo*_*pty 1

尽管我对 Angular 几乎完全陌生,但我正在回答自己的问题,但仍然想要其他答案,以防我解决问题的方式不被认为是“惯用的”Angular。

具体来说,我没有使用隔离范围,而是利用attrs下面代码中的第三个(属性)链接/函数参数,否则将新columnselector属性与我的指令一起获取到 html。这是普遍接受的做法吗?

'use strict';

angular.module('cmt.cases.directives')

.directive('fixedColumnTooltip', function ($timeout) {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            if (scope.$last === true) {
                $timeout(function () {
                    element.parent().find(attrs.columnselector).each(function() {
                        var td = $(this);
                        var span = td.find('span');

                        if (span.width() > td.width()){
                            span.attr('data-toggle','tooltip');
                            span.attr('data-placement','right');
                            span.attr('title', span.html());
                        }
                    });
                });
            }
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

附录:正如您从评论中看到的那样,尽管尝试了几种不同的方式,但我仍无法使该答案中的代码正常工作。如果我在合并该答案方面做错了什么,请告诉我。

与此同时,我找到了另一种方法来做到这一点,但这几乎肯定更多的是“代码味道”,而不是利用这个attrs论点。具体来说,我发现我可以使用隔离范围,然后访问该范围的$parent范围属性。然后我将按如下方式开始我的代码,但我并不提倡这样做,而只是注意到它,因为看起来 TMTOWTDI (有不止一种方法可以做到这一点)肯定适用于 Angular:

'use strict';

angular.module('cmt.cases.directives')

.directive('fixedColumnTooltip', function ($timeout) {
    return {
        restrict: 'A',
        scope: {
            columnselector: '@'
        },
        link: function (scope, element, attrs) {
            if (scope.$parent.$last === true) {
                $timeout(function () {
                    element.parent().find(scope.columnselector).each(function() {
                    ...
Run Code Online (Sandbox Code Playgroud)