Angularjs + socket + не удается передать данные в контроллер

Я новичок в этой розетке. I использование backend node js и frontend angularjs.

Моя печать данных в службе, но не может получить эти данные в контроллер.

сервер.js:

var server = app.listen(port);
var io = require('socket.io').listen(server);
io.on('connection', function(socket) {
    setInterval(function() {
        socket.emit('addCustomer', {
            time : new Date() + "8989"
        });
    }, 1000);
});

услуга.js:

var app = угловой.модуль (‘myApp’);

app.factory('socket', ['$rootScope',
function($rootScope) {
    var socket = io.connect('http://localhost:9090');

    return {
        // replace with the code below
        on : function() {//on: function(addCustomer){
            socket.on("addCustomer", function(customer) {
                console.log("Socket Factory - customer added", customer);
                return customer;
            });
        },
        emit : function(addCustomer, data) {
            console.log("rk");
            console.log(data);
            socket.emit(addCustomer, data);
        }
    };
}]); 

контроллер.js:

var app = angular.module('myApp');

app.controller('CustomerCtrl', function($scope, socket) {

    socket.on('addCustomer', function(data) {
        console.log(data);
        console.log("--")
        $scope.time = data.time;
    });

}) 

Вывод печати в консоли в Заводском файле. но я не могу передать эти данные в контроллер. pls кто-нибудь помочь решить эту проблему.

вывод в консоли:

Socket Factory - customer added Object {time: "Thu Sep 29 2016 16:52:44 GMT+0530 (IST)8989"}
socketService.js:11 Socket Factory - customer added Object {time: "Thu Sep 29 2016 16:52:45 GMT+0530 (IST)8989"}
socketService.js:11 Socket Factory - customer added Object {time: "Thu Sep 29 2016 16:52:46 GMT+0530 (IST)8989"}

2 ответа

  1. вы должны запустить angular digest, когда вы изменяете данные вне angular lifectycle (в неугловых асинхронных функциях)

    socket.on('addCustomer', function(data) {
            console.log(data);
            console.log("--")
            $scope.time = data.time;
            $scope.$apply(); //this call actiually should be placed in your service
    });
    

    отредактированный:

    ах, sry, вы просто не предоставляете params к вашим услугам. изменить метод обслуживания с соответствующим:

    функция ($rootScope) {
    var socket = io.connect (‘ http://localhost:9090 ‘);

    return {
        // replace with the code below
        on : function(type, cb) {//on: function(addCustomer){
            socket.on(type, cb);
        }
    };
    
  2. Правильно ли вы вызываете контроллер из своего представления. Вы можете посмотреть здесь для получения дополнительной информации AngularJS. Как вызвать функцию контроллера извне компонента контроллера

    Не могли бы вы скопировать файл представления, чтобы мы могли посмотреть.

    Кроме того , если ничего не получается, я бы попытался явно загрузить слушателя, что-то вроде этого.

    var app = angular.module('myApp');
    
    app.controller('CustomerCtrl', function($scope, socket) {
    
        $scope.loadListener = function() {
            Console.log("Loading listener for event addCustomer")    
            socket.on('addCustomer', function(data) {
                console.log(data);
                console.log("--")
                $scope.time = data.time;
            });
        }
    
       $scope.testAlert = function() { alert("Method bound to controller") }
    })
    

    И явно привязать метод loadListener к кнопке с помощью ng-click просто, чтобы проверить, если ваш контроллер на самом деле связан должным образом.

    Есть и другой подход через ng-init. Вы можете взглянуть на эту нить.
    Как выполнить функцию углового контроллера при загрузке страницы?

    С ng-init вы, вероятно, могли бы сделать

    <div data-ng-controller="CustomerCtrl" data-ng-init="loadListener()"></div>
    

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