2013-04-30 3 views
1

У меня есть служба, которая соединяющую своих клиентов к серверу Socket.io:Angular.js: Как я могу избежать кеширования?

var serviceSocketIo = angular.module('myApp.services', []); 

serviceSocketIo.factory('mySocket',['$rootScope', '$routeParams', function ($rootScope, $routeParams) { 
    var base = $rootScope.base, //base = 'http://localhost:3000' 
    channel = '/' + $routeParams.game, 
    url = base + channel, 
    mySocket; 

    console.log('service: connection to ' + url); 
    mySocket = io.connect(url); 
    return { 
    base: base, 
    channel: channel, 
    socket: mySocket, 
    on: function (eventName, callback) { 
     mySocket.on(eventName, function() { 
     var args = arguments; 
     $rootScope.$apply(function() { 
      callback.apply(mySocket, args); 
     }); 
     }); 
    }, 
    emit: function (eventName, data, callback) { 
     mySocket.emit(eventName, data, function() { 
     var args = arguments; 
     $rootScope.$apply(function() { 
      if (callback) { 
      callback.apply(mySocket, args); 
      } 
     }); 
     }) 
    } 
    }; 
}]); 

Пожалуйста, обратите внимание, что пространство имен зависит от $ routePrams PARAMATERS.

Что мне нужно - это удалить службу из кеша, прежде чем ее инициировать. Поэтому я буду уверен, что службы свяжут клиентов с правильным URL-адресом. Или, если есть другой способ заставить мой сервис проверить параметры?

ответ

0

Сервисные/заводские методы запускаются только один раз и с этой точки используется возвращаемое значение. Если вы хотите настроить возможности того, что вы возвращаете, поместите их как аргументы в члены функции того, что вы возвращаете. например уведомите yourArg:

var serviceSocketIo = angular.module('myApp.services', []); 

serviceSocketIo.factory('mySocket',['$rootScope', '$routeParams', function ($rootScope, $routeParams) { 
    var base = $rootScope.base, //base = 'http://localhost:3000' 
    channel = '/' + $routeParams.game, 
    url = base + channel, 
    mySocket; 

    console.log('service: connection to ' + url); 
    mySocket = io.connect(url); 
    return { 
    base: base, 
    channel: channel, 
    socket: mySocket, 
    // Notice yourArg 
    on: function (eventName, callback, yourArg) { 
     // Use yourArg to customize behaviour: 
     mySocket.on(eventName, function() { 
     var args = arguments; 
     $rootScope.$apply(function() { 
      callback.apply(mySocket, args); 
     }); 
     }); 
    }, 
    emit: function (eventName, data, callback) { 
     mySocket.emit(eventName, data, function() { 
     var args = arguments; 
     $rootScope.$apply(function() { 
      if (callback) { 
      callback.apply(mySocket, args); 
      } 
     }); 
     }) 
    } 
    }; 
}]); 
+0

Я боюсь, что это решение не может мне помочь, позволь мне объяснить более мою проблему: Я инъекционный мою службу до двух дифферентов контроллеров, так что когда я присоединяюсь к маршруту по отношению, например, к первому контроллеру, конечно, моя служба связывает меня с пространством имен относительно этого маршрута, но если я изменю маршрут, моя служба все еще связывает меня с тем же маршрутом. и это потому, что, как вы сказали, методы services/factory запускаются только один раз, поэтому они кэшируются. И я не знаю, как я могу избежать такого поведения. – hamou92

1

Заводы и услуги в угловых являются односложными, и нет никакой конфигурации, чтобы сделать их иначе. Если вы хотите, такой контроль необходимо использовать методы на $ предоставить объект:

Получить доступ обеспечить с помощью app.config:

app.config(function($provide) { 
    // Now you have provide 
}); 

Вы можете использовать его, чтобы создать свою собственную политику пользовательских конкретизации используя то, что вы вернуться от $ получить:

$provide.provider('foo', function(){ 
    this.$get = function(dep) {...} 
}); 

Ссылка: http://slides.wesalvaro.com/20121113/#/2/6

+0

Спасибо. слайд был полезен. – hamou92

1

что позволяя вам создать службу, которая создает сокет для вас?

var services = angular.module('myApp.services', []); 

services.service('SocketService', function() { 
    var SocketService = function() { 
     this.createSocket = function (url) { 
      return io.connect(url); 
     } 
    }; 

    return SocketService; 
}); 
+0

Спасибо, я пробовал что-то вроде этого, но с использованием фабрики и работает. – hamou92

Смежные вопросы