Показать сообщение отдельно
  #1 (permalink)  
Старый 18.09.2013, 22:36
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Взаимодействие контроллеров друг с другом
Всем привет

Интересует вопрос взаимодействия "несвязанных" друг с другом контроллеров. Упрощенный пример верстки:

<div ng-controller="Controller1" ng-scope>
... some
</div>
...
<div ng-controller="Controller2" ng-scope>
... some
</div>


Насколько я понимаю, "по-феншую" в ангуляре для взаимодействия контроллеров я должен использовать "объект-посредник":
angular


    .module( 'app', [])


    .factory( '$mediator', function() {
        return { /* code */  };
    })


    .controller( 'Controller1', function( $scope, $mediator ) {
        var model = $scope.model = {};
    })

    .controller( 'Controller2', function( $scope, $mediator ) {
        var model = $scope.model = {};
    });


Я и не против.
В чем проблема: приходится периодически обмениваться сообщениями/данными одному контроллеру с другим или наоборот. Для этих целей создаю изолированный scope и использую его реализацию подписки на события и поджиг событий. Выглядит это так:
angular
    
    
    .module( 'app', [])


    .factory( '$mediator', function( $rootScope ) {
        return $rootScope.$new( true ); // isolate
    })


    .controller( 'Controller1', function( $scope, $mediator ) {
        var model = $scope.model = {
            field: null
        };

        // subscribe to event
        $mediator.$on( 'my:event', function( event, data ) {
            // ...
        });
    })

    .controller( 'Controller2', function( $scope, $mediator ) {
        var model = $scope.model = {
            field: null
        };

        // fire event
        $mediator.$emit( 'my:event', 'data' );
    });

Работает, но: поджиг события в изолированном scope ($mediator) вызывает пересчет обработчиков всего приложения при данной реализации, а этого хотелось бы избежать.

Кто-что думает на этот счет? Возможно, все проще, чем кажется

Только не надо предлагать для обмена событиями обещания. Они, насколько мне известно, "одноразовые".

Спасибо )
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием