Передать переменную из директивы в контроллер

У меня есть это определение директивы и хочу передать currentScriptPath к TestController,

Как я могу это сделать?

(function(currentScriptPath){
    angular.module('app', [])
        .directive('test', function () {
            return {
                restrict: 'E',
                scope: {},
                templateUrl: currentScriptPath.replace('.js', '.html'),
                replace: true,
                controller: TestController,
                controllerAs: 'vm',
                bindToController: true
        };
    });
})(
    (function () {
        var scripts = document.getElementsByTagName("script");
        var currentScriptPath = scripts[scripts.length - 1].src;
        return currentScriptPath;
    })()
);

TestController.$inject = ['$scope'];

function TestController($scope) {
    // try to access $scope.currentScriptPath here
}

1 ответ

Решение

Как вы хотите получить доступ currentScriptPath в вашем директиве контроллера. Вам нужно только прикрепить эту переменную в вашей текущей области видимости внутри link функция директивы и эта область будет currentScriptPath доступный вам контроллер TestController сфера, потому что вы использовали bindToController: true, в вашей директиве.

наценка

<div ng-controller="Ctrl">
    <test></test>
</div>

директива

(function(currentScriptPath) {
    angular.module('app', [])
    .directive('test', function() {
      return {
        restrict: 'E',
        scope: {},
        templateUrl: currentScriptPath.replace('.js', '.html'),
        replace: true,
        controller: TestController,
        controllerAs: 'vm',
        bindToController: true,
        link: function(scope, element, attrs) {
          scope.currentScriptPath = currentScriptPath; //will update the value of parent controller.
        }
      };
    });
})(
  (function() {
    var scripts = document.getElementsByTagName("script");
    var currentScriptPath = scripts[scripts.length - 1].src;
    return currentScriptPath;
  })()
);

контроллер

function TestController($scope, $timeout) {
  var vm = this;
  $timeout(function() {
    alert($scope.currentScriptPath) //gets called after link function is initialized
  })
}

Демо Планкр

Другие вопросы по тегам