Socket.io и $scope.$apply()

Я пытаюсь создать приложение для голосования в реальном времени, используя angular-fullstack. У меня все работает, за исключением того, что когда я получаю голосование, мои проценты не обновляются. Я решил, что мне нужно вызвать $scope.$apply(), чтобы заставить Angular обновить представление, но я не уверен, как это сделать, используя socket.service.js, который предоставляет angular-fullstack. Я включаю фабрику angular-fullstack ниже. Я не уверен, что вызов $scope.$apply() в моем контроллере будет иметь значение. Я попытался вызвать его как обратный вызов моей функции socket.io, и это, похоже, не имело значения. Я новичок в MEAN и сокетах в целом, поэтому я ценю помощь.

Спасибо!

angular.module('pollv1App')
  .factory('socket', function(socketFactory) {

    // socket.io now auto-configures its connection when we ommit a connection url
    var ioSocket = io('', {
      // Send auth token on connection, you will need to DI the Auth service above
      // 'query': 'token=' + Auth.getToken()
      path: '/socket.io-client'
    });

    var socket = socketFactory({
      ioSocket: ioSocket
    });

    return {
      socket: socket,

      /**
       * Register listeners to sync an array with updates on a model
       *
       * Takes the array we want to sync, the model name that socket updates are sent from,
       * and an optional callback function after new items are updated.
       *
       * @param {String} modelName
       * @param {Array} array
       * @param {Function} cb
       */
      syncUpdates: function (modelName, array, cb) {
        cb = cb || angular.noop;

        /**
         * Syncs item creation/updates on 'model:save'
         */
        socket.on(modelName + ':save', function (item) {
          var oldItem = _.find(array, {_id: item._id});
          var index = array.indexOf(oldItem);
          var event = 'created';

          // replace oldItem if it exists
          // otherwise just add item to the collection
          if (oldItem) {
            array.splice(index, 1, item);
            event = 'updated';
          } else {
            array.push(item);
          }
          cb(event, item, array);
        });

ИЗМЕНИТЬ
Вот мой контроллер:

'use strict';

angular.module('pollv1App')
  .controller('VisualizeCtrl', function ($scope, $http, socket) {

    $scope.votes = [];  
    $scope.totalVotes = 0;

    $scope.resetVotes = function(){
      $http.get('/api/keywords/reset');
      $scope.votes = [];
      console.log('reset: ' + $scope.votes);
    };

    $http.get('/api/keywords').success(function(keywords){
      $scope.keywords = keywords;
      socket.syncUpdates('keyword', $scope.keywords);
      socket.syncUpdates('sms', $scope.votes, function(){
        $scope.$apply();
      });
    });

    $http.get('/api/sms').success(function(smss){
      $scope.votes = smss;
    }); 
  });

person anguiac7    schedule 06.10.2014    source источник
comment
не могли бы вы также показать, как вы звоните/используете эту услугу? (чтобы увидеть, что вы делаете на cb)   -  person BlaShadow    schedule 06.10.2014
comment
@BlaShadow только что добавил код моего контроллера. Спасибо, что посмотрели!   -  person anguiac7    schedule 07.10.2014


Ответы (1)


В конце концов, я перешел от использования контроллера и сокета для получения общего количества голосов к использованию пользовательского фильтра. Таким образом, мне не пришлось бы беспокоиться об обновлении прицела. Я получил идею из этого сообщения: Увеличить переменную в шаблоне AngularJS.

person anguiac7    schedule 07.10.2014