2013-08-19 4 views
3

Есть ли способ обновить контроллер в угловом? Рассмотрим следующий пример:Контроллер обновления в AngularJS

<div ng-controller="MsgCtrl" ng-repeat="m in messages">{{m}}<br></div> 
<script> 
var ws = new WebSocket(something, something); 
function MsgCtrl($scope) { 
    $scope.messages = []; 
    ws.onmessage = function(e) { 
     $scope.$apply(function() { 
      $scope.messages.push(e.data); 
     }); 
    } 
} 
</script> 

Если соединение WebSocket не удается, либо должен быть перезапущен по какой-то причине, новый WebSocket должен быть создан и слушал. Есть ли способ заставить контроллер запускаться снова, создавая новую функцию прослушивания, чтобы направить сообщения нового соединения в $ scope?

Кроме того, в качестве второстепенного вопроса: есть ли хорошее место, чтобы узнать больше об Угловом? Документация на сайте кажется немного неясной.

+1

узнать больше о Угловой: http://egghead.io – AdityaSaxena

+0

Второй egghead.io также http://www.bennadel.com/blog/2446-Using-Controllers-In-Directives-In-AngularJS.htm и http : //www.yearofmoo.com/ также http://www.youtube.com/watch?v=ZhfUv0spHCY много других вещей на youtube. Есть книга О'Рейли, но она была немедленно устаревшей. Также проверьте йоман и угловое семя, даже если вы их не используете, они хороши для примеров. – shaunhusain

ответ

2

Веб-сокет необходимо переподключить, если соединение не выполнено или его необходимо перезапустить для некоторого повторного поселения. Я думаю, что вы не должны перезапускать сетевой sockect путем «перезапуска контроллера».

Мое предложение состоит в том, чтобы создать службу «веб-сокета», которая будет поддерживать свою собственную логику (например, повторно подключить сокет при сбое соединения), а контроллер просто обрабатывает модель и связывает вид.

<html ng-app="MyApp"> 
.... 
<div ng-controller="MsgCtrl" ng-repeat="m in messages">{{m}}<br></div> 
</html> 
<script> 

    var myApp = angular.module("MyApp",[]); 
    myApp.factory("WebSocket",function(){ 
     var ws; 
     var triedTime=0; 
     var maxRetryTime=20; 
     return { 
      createWS: function(server,protocol,handler){ 
       ws = new WebSocket(server, protocol); 
       ws.onmessage = handler; 
       ws.onerror = function(e){ 
        this.restartWS(server,protocol,handler); 
       } 
      }, 
      closeWS: function(){ 
       if(ws) ws.close(); 
      }, 
      restartWS: function(server,protocol,handler){ 
       if(triedTime<=maxRetryTime){ 
        this.closeWS(); 
        this.createWS(server,protocol); 
        triedTime++; 
       } 
      } 
     }; 
    }); 

    function MsgCtrl($scope, WebSocket){ 
     $scope.messages = []; 

     WebSocket.createWS("something","something",$scope.msgHandler); 

     $scope.msgHandler = function(e){ 
      $scope.$apply(function() { 
       //model update 
       $scope.messages.push(e.data); 

       var msg = JSON.parse(e.data); 

       switch(msg.cmd) 
       { 
        case "restart": 
        WebSocket.restartWS("something","something",$scope.msgHandler); 
        break; 
       } 
      }); 
     } 

    } 
</script> 

В приведенном выше примере веб-сокет будет повторно подключен, когда клиент сокета получит сообщение «перезагрузить» или соединение не выполнено. Надеюсь, это поможет вам.

1
  1. Один из решений пытается перезагрузить страницу, используя $route.reload(). Лучшее решение - попытаться восстановить websocket на onerror.

  2. Я нахожу лучшее место для изучения angularJS is Egghead. И stackoverflow всегда является лучшим местом, чтобы задать вопрос, если вам не ясно.

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