@Filoret256
начинающий JS developer

Как правльно сделать сервис\фабрику с socket.io чтобы для каждогой директивы прилетали свои данные?

Всем привет, имеим
main.js
angular.module('app',['btford.socket-io'])
    .factory('socket', function (socketFactory) {
        var myIoSocket = io.connect('http://localhost');

        var mySocket = socketFactory({
            ioSocket: myIoSocket
        });

        return mySocket;
    })
    .directive('myDir',function(){

        return {
            restrict: 'E',
            scope:{
                marker:'@'
            },
            template: '<p ng-bind="marker"></p><ul><li ng-repeat="item in ItemList"><div ng-bind="item"></div></li></ul>',
            controller:function($scope, socket){

                socket.emit('joinRoom', $scope.marker );

                socket.on('updateEvent',function(data){
                    $scope.ItemList= data;
                });

            }
        };
    })

    .controller('main',function($scope, $http){

        $http.get('localhost/api/getList')
            .success(function(data){
                $scope.markerlist = data;

            });
    });


index.html
<html lang="en">
    <body  ng-app="app">

        <div ng-controller='main' class="main">
            <div ng-repeat='marker in markerlist'>
                <my-dir marker='{{marker}}'></my-dir>
            </div>
        </div>
    </body>
        <script src="./libs/socket.io-client/socket.io.js"></script>
        <script src="./libs/angular/angular.min.js"></script>
        <script src="./libs/angular-socket-io/socket.min.js"></script>
        <script src="./js/main.js"></script>
    </html>


как должно отрабатывать:
1) открываем страничку
2) по http получаем первычные данные
3) отрисовываются директивы
4) каждая директива подключается к своей комнате и ждет сообщений от сервера
5) сервер генерит сообщение
6) директива получает это сообщение только из своей комнаты куда подключилась и изменяет данные в только своем скоупе

но в реализации выше при генерации сообщения, данные получают все директивы , т.е. если сгенерилось сообщение для комнаты marker1 это сообщение получат все директивы: marker1 и marker2 и marker3, и информация будет везде одинаковая
я так полагаю это из-за того что каждая директива слушает сообщения без пирвязки к комнате? как это исправить?
может не правильно сделал фабрику? или в самой директиве надо логику поменять?
  • Вопрос задан
  • 2299 просмотров
Решения вопроса 1
@vsvladimir
Вот такой вариант может помочь:
var myIoSocket = io.connect('http://localhost', {'force new connection': true});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Делаете сервис $connections с методом $get или что-то в этом духе. Если коннекшена такого нет - будет создан, если есть - отдается готовый.

В вашем случае я бы еще ввел менеджер комнат, что бы в нем шла вся логика по приссоединению к конкретной группе и т.д. что бы максимально отделить это дело от директив. То есть в директиве вы просто попросите "дай ка мне доступ к такой-то комнате" и все. Никаких эмитов и вообще работы с сокетами внутри директив.

И не инициализируйте ничего внутри фэктори.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы