@bioforge
Верстающий пыхер

Как правильно организовать общение между контролером, директивой и директивой вне контроллера?

Добрый день!

Пишу модальное окно на ангуляре. Проблема в том, что не знаю, как правильно прокинуть $scope контроллера к директиве, которая создаётся динамически, с помощью другой директивы.
Сейчас делаю так: передаю из директивы modal $scope через сервис, а в modalWindow получаю так $scope.$parent.attrs.scope
Подскажите как можно сделать нормально ?

angular.module('App').controller('controller', controller);
function controller($scope, $http) {

    $scope.validate = function(){
        console.log('validate');
    };
}


angular.module('App').service('modalService', ModalService);
function ModalService($compile, $timeout, $rootScope, $templateRequest) {
    return function(content, option){
        $templateRequest('/popup.template.html').then(function(response){
            var newScope = $rootScope.$new(true);
            var clone;

            newScope.attrs = option || {};

            clone = $compile(response)(newScope);

            angular.element(document.body).append(clone);
        });
    }
}

angular.module('App').directive('modal', ModalDirective);
function ModalDirective(modalService) {
    return {
        scope: true,
        restrict: 'EA',
        link: function ($scope, $element, $attr) {
            $element.on('click', function (event) {
                event.preventDefault();

                modalService('content', {
                    scope: $scope,
                    title: $attr.title,
                    contentUrl: $attr.contentUrl
                });
            });

        }

    }
}

angular.module('App').directive('modalWindow', ModalWindow);
function ModalWindow($timeout, $log, $templateRequest, $compile) {
    return {
        restrict: 'E',
        scope: true,
        link: function ($scope, $element) {

            $scope.loading = false;

            // Загружаем содежимое по адресу для всплывающего окна
            if ( $scope.$parent.attrs.contentUrl ) {
                $templateRequest($scope.$parent.attrs.contentUrl).then(function(response){
                    var clone = $compile(response)($scope);
                    $element.find('.modal-body').html(clone);

                    $scope.show();

                });
            }

            // Вставляем содержимое для окна
            if ( $scope.$parent.attrs.content ) {
                var clone = $compile($scope.$parent.attrs.content)($scope);
                $element.find('.modal-body').html(clone);
                $scope.show();
            }


        },

        controller: function ($scope, $element) {

            $scope.validate = $scope.$parent.attrs.scope.validate;

            $scope.show = function () {
                $scope.visible = true;
                $scope.loading = false;
                $element.addClass('in');
            };

            $scope.hide = function () {
                $scope.loading = false;
                $scope.visible = false;

                $timeout(function () {
                    $element.remove();
                }, 3000)
            };

            $scope.startLoading = function() {
                $timeout(function() {
                    if (!$scope.visible) {
                        $scope.loading = true;
                    }
                }, 300);
            }

        }

    }
}


<div class="menu-actions-add pull-left" ng-controller="controller">
    <modal data-title="title" data-content-url="/template.html">
        modal
    </modal>
</div>
  • Вопрос задан
  • 303 просмотра
Пригласить эксперта
Ответы на вопрос 1
Как сделать нормально:
1. Поставить 1.5
1.1. Одним из самых важных нововведений в 1.5 является появление компонент. дока ангуляра.
2. Забыть о параметре $scope.
3. Посмотьре что такое ангулярские сервисы: дока ангуляра
4. Почитать о FLUX: фейсбук FLUX
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы