2015-06-22 6 views
5

Mam konfigurację klient-serwer socket.io z AngularJS uruchomionym na kliencie.Komunikat Socket.IO nie aktualizuje Zmienna kątowa

// Server.js 
var io = require('socket.io')(server); 


io.on('connection', function (socket) { 
socket.on('message', function (msg) { 
    //console.log(msg); 
    console.log(msg); 
    io.emit('message', msg); 
}); 
}); 

Jak zaobserwowano, że zasadniczo emituje message wydarzenia z danych przechowywanych w zmiennej msg.

A następnie mam następujący kod klienta.

var container = angular.module("AdminApp", []); 

container.controller("StatsController", function($scope) { 

    var socket = io.connect(); 

    socket.on('message', function (msg) { 
     console.log(msg); 
     $scope.frontEnd = msg; 
    }); 
}); 

Mam teraz do czynienia z dziwnym problemem. Kiedy piszę poniższy fragment kodu, aby wydrukować frontEnd, nie pojawi się on. Ale działa console.log(msg); i pokazuje mi dane wysyłane ze zmiennej msg.

<body ng-app="AdminApp"> 

    <div ng-controller="StatsController"> 
     <p>{{frontEnd}}</p> //Doesn't show anything 
    </div> 

</body> 

Czy ktoś może mi pomóc?

Odpowiedz

8

Musisz zawinąć zmianę modelu (zmieniając właściwości na $scope), z $scope.$apply(function() {}), aby zaktualizować widok.

var container = angular.module("AdminApp", []); 

    container.controller("StatsController", function($scope) { 

     var socket = io.connect(); 

     socket.on('message', function (msg) { 
      console.log(msg); 
      $scope.$apply(function() { $scope.frontEnd = msg; }); 
     }); 
    }); 

$ apply() służy do wykonywania wyraz w kanciasty spoza kątowa ramowej. (Na przykład z zdarzeń DOM przeglądarki, setTimeout, XHR lub bibliotek stron trzecich). Ponieważ wywołujemy w architekturze kątowej, musimy wykonać właściwy cykl życia w zakresie obsługi wyjątków , wykonując zegarki.

Z oficjalnej Angular Documentation

+0

Pracował świetnie. Wielkie dzięki :) –

+0

Uratowałem mój dzień. Dzięki – sand

0

Jest to prawdopodobnie dlatego socket.on('message', function (msg) {.. jest z kątowym wiedzy. coś, co dzieje się poza kanciastą.

Następnie, jeśli o czymś poza kątowa to trzeba powiedzieć kątowa zaktualizować, ponieważ istnieje coś zaktualizować

użycie $scope.$apply() po $scope.frontEnd = msg;

Albo korzystniej owinąć go w $timeout jak

$timeout(function() { 
    $scope.frontEnd = msg; 
}); 

tutaj jest dobry explanation dlaczego $timeout jest bardziej pre Ferable.

Powiązane problemy