Как передать переменную в контроллер из директивы, которая находится за пределами контроллера?

0

Мне нужно получить некоторые атрибуты, которые устанавливаются в div ng-view (вне области основного контроллера). Использование пользовательской директивы для передачи значений атрибутов - это решение, которое я предполагаю. Итак, у меня есть:

<body ng-app="myapp">
    <!--Load ng-view and add attrs-->
    <div ng-view 
         my-directive 
         first-attr="attrOne" 
         second-attr="attrSecond">
    </div>
</body>

директива:

.directive('myDirective', myDirective);

function myDirective() {
    var directive = {
        restrict: 'AE',
        link:link,
        scope: {
            firstVal: '=firstAttr',
            secondVal: '=secondAttr'
        }
    };
    return directive;
}

настройки приложения и контроллер:

angular
    .module('myapp', [
        'ui.router'
    ])
    .config(function ($stateProvider, $urlRouterProvider) {
        $urlRouterProvider.otherwise('/myApp');
        $stateProvider
            .state('myApp', {
                url: '/myApp',
                templateUrl: 'main.html',
                controller: 'mainCtrl'
            });

    });

.controller(mainCtrl, mainCtrl);

function mainCtrl ($scope) {

}

Возможно ли получить эти значения атрибутов в основном контроллере при загрузке страницы?

Заранее спасибо!

  • 0
    Вы пропустили, чтобы объяснить, где и как используется ваш mainCtrl
  • 0
    @alfrescian Я добавил настройки UI-роутера, которые показывают, как / где загружается mainCtrl
Теги:
angularjs-scope

1 ответ

0

Предполагая, что существует родительская дочерняя связь между "mainController" и директивой.

Вы можете использовать излучатель событий

директива:

.directive('myDirective', myDirective);

function myDirective() {
    var directive = {
        restrict: 'AE',
        link:link,
        controller:controller
        scope: {
            firstVal: '=firstAttr',
            secondVal: '=secondAttr'
        }
    }
    return directive;

    function controller($scope){
        //SOME LOGIC
        $scope.firstVal = "firstVal LOGIC"
        $scope.secondVal = "secondVal LOGIC"

        //EMIT AFTER LOGIC DONE
        var data = { firstVal: $scope.firstVal, secondVal: $scope.secondVal};
        $scope.$emit('YOUR_CONTROLLER_EVENT', data);
    }
}

контроллер:

.controller(mainCtrl, mainCtrl);

function mainCtrl ($scope) {
    $scope.$on('YOUR_CONTROLLER_EVENT', function(event, data){
        var firstVal = data.firstVal;
        var secondVal = data.secondVal;
    });
}
  • 0
    Ваше решение подразумевает наличие отношения родитель-потомок, и оно разорвется, как только директива будет размещена где-то за пределами этих отношений, поэтому я бы не стал рекомендовать это решение.
  • 0
    Он назвал контроллер «mainController», поэтому я предположил, что есть родительские дочерние отношения. Но я все равно отредактирую свой ответ. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню