AngularJS:从装饰器内部访问工厂

时间:2014-10-16 15:03:29

标签: angularjs decorator

我正在使用装饰器扩展第三方指令。我想访问装饰器中的一个工厂。我怎么能这样做?

$provide.decorator( 'multiSelectDirective', function( $delegate ) {
    var directive = $delegate[0],
        link = directive.link;

    // wipe out the shitty template
    directive.template = '';

    // make with the new template!
    directive.templateUrl = 'app/partials/filters.template.html';

    // hook into the compile phase of the directive
    directive.compile = function( ) {

        // the function returned by compile is the new link function
        return function( $scope, el, attrs ) {

            // run the original link function.
            link.apply(this, arguments);

            $scope.filterClicked = function( buttonName, selection ) {
                handleFilterClick( buttonName, selection, JiraData, GreyGooseApi );             
            }

        }
    };

    return $delegate;
});

2 个答案:

答案 0 :(得分:0)

我明白了。我能够以下列方式注入依赖项:

$provide.decorator( 'multiSelectDirective',
    [ '$delegate', 'JiraData', 'GreyGooseAPI',
    function( $delegate, JiraData, GreyGooseApi ) {
        var directive = $delegate[0],
            link = directive.link;

        // wipe out the shitty template
        directive.template = '';

        // make with the new template!
        directive.templateUrl = 'app/partials/filters.template.html';

        // hook into the compile phase of the directive
        directive.compile = function( ) {

            // the function returned by compile is the new link function
            return function( $scope, el, attrs ) {

                // run the original link function.
        link.apply(this, arguments);

        $scope.filterClicked = function( buttonName, selection ) {
            handleFilterClick( buttonName, selection, JiraData, GreyGooseApi );
        }

            }
        };

        return $delegate;
    }]);

});

答案 1 :(得分:0)

您可以通过overloading访问工厂公开的所有属性,如果未曝光您无法访问该属性。