Использование PrivatePub с Angular JS

Я пытаюсь использовать PrivatePub в своем приложении Angular. У меня есть чат, и сообщения управляются AngularJS, мой API работает с Rails, в моем контроллере я использую помощник для публикации на канале, моя проблема на стороне клиента с подпиской. Вот что я пытаюсь сделать:

chat.controller("MessageController", ['$scope','Message','Project', function($scope,Message,Project) {
    //Fetch messages
    Message.query(function(data) {
        $scope.messages = data;
    });

    PrivatePub.subscribe(Project.channel, function(data, channel) {
        $scope.messages.push(data.message);
    });
}]);

Я пытался использовать $apply и $watch для подписки на PrivatePub, но никак не мог обновить область действия. Моя функция PrivatePub должна быть вне Angular, но данные, которые она получает, должны быть добавлены в $scope. Я не знаю, какое другое решение я мог бы попробовать.


person Thomas Quiroga    schedule 13.09.2014    source источник
comment
it didn't work не так много объяснений. Как вы пытались использовать $apply и что получилось? вылетели ошибки?   -  person charlietfl    schedule 13.09.2014
comment
Сначала я получил Error: $digest already in progress, я нашел несколько ответов, таких как этот if(!$scope.$$phase) { //$apply }, который, по-видимому, не рекомендуется, когда я его использую, мой код вообще не выполняется. Когда я использовал $watch, мой код выполняется, но область действия не обновляется.   -  person Thomas Quiroga    schedule 13.09.2014
comment
попробуйте использовать $timeout, будет ждать завершения дайджеста   -  person charlietfl    schedule 13.09.2014
comment
Я только что попробовал использовать $timeout, например здесь. не обновляется немедленно, я мгновенно получаю данные в своей консоли, но представление не обновляется до тех пор, пока я не инициирую некоторые события в своем пользовательском интерфейсе. Это похоже на то, что Angular не знает, что область действия получает новое значение.   -  person Thomas Quiroga    schedule 13.09.2014


Ответы (1)


Хорошо, я нашел проблему, я неправильно использовал $apply, я в основном делал:

$timeout(function () {
  $scope.$apply(function($scope) {
    PrivatePub.subscribe("/mychannel", function(data, channel) {
      $scope.addMessage(data.chat_message);
    });
  });
}, 0);

Вместо:

$timeout(function () {
   PrivatePub.subscribe("/mychannel", function(data, channel) {
     $scope.$apply(function($scope) {
       $scope.addMessage(data.chat_message);
     });
   });
}, 0);

Изменения, которые я хочу сообщить Angular, — это не сама функция, а то, что произошло внутри. Просто плохое использование.

person Thomas Quiroga    schedule 13.09.2014