$ location не работает в пользовательской директиве AngularJS - PullRequest
0 голосов
/ 04 января 2019

У меня есть пользовательская директива, например:

angular.module('app.directive').directive('myProductSwitcherDropdown',myProductSwitcherDropdown);

myProductSwitcherDropdown.$inject =  ['$compile'];
 function myProductSwitcherDropdown() {
    return {
        restrict: 'E',
        transclude: 'true',
        scope: {
          domainobject:"=",
          ctrlFn:"&"
        },
        templateUrl: "src/directive/templates/my-product-switcher-dropdown.html",

        controller: ['$scope', 'UtilService', function($scope,UtilService) {
            debugger;
            var self = this;
            $scope.instance =self;

            self.dropDownChanged = function(item) {
                debugger;
                $scope.ctrlFn();
            };


        }],
       controllerAs: 'myProductSwitcherDrpdwnCtrl'
  }
}

Я вызываю директиву так:

<div class='notification-tray'></div>
<div class="left-menu pull-left">
  <my-product-switcher-dropdown domainobject="domainobject" ctrl-fn="ctrlFn()">
  </my-product-switcher-dropdown>
</div>

Но в моем контроллере, когда внутри ctrlFn() я пытаюсь использовать say $location or $window, он приходит как undefined .

Я сделал инъекцию слишком много.

angular.module('workspaces.domain').controller('DomainController',DomainController);
DomainController.$inject =  ['$scope', '$rootScope', '$location'];
    function DomainController ($scope, $rootScope, $location) {
        var self = this;
        ....
        ....

        //$location is accessible here though 

        $scope.ctrlFn = function () {
            //Undefined here
            debugger;
        };

Раньше ctrlFn() $location был доступен, но внутри его нет. Что я делаю не так?

1 Ответ

0 голосов
/ 05 января 2019

Это артефакт консоли разработчика.Внутренний код должен ссылаться на $location, чтобы механизм JavaScript создавал замыкание :

angular.module('workspaces.domain').controller('DomainController',DomainController);
DomainController.$inject =  ['$scope', '$rootScope', '$location'];
    function DomainController ($scope, $rootScope, $location) {
        var self = this;
        ....
        ....

        //$location is accessible here though 

        $scope.ctrlFn = function () {
            //ADD reference to $location
            $location;
            //OR
            console.log($location);
            //Will also be defined here
            debugger;
        };

Оба метода заставляют механизм JavaScript создавать замыкание , котороебудет виден отладчику консоли разработчика.

...