2016-01-03 18 views
2

即時嘗試使用角度服務,以便從我的節點js服務器傳遞到我的視圖json對象。 我debuged服務功能,看到它真的得到的對象,但是當我返回對象數組我得到$ scope.messages = undefined。使用角度工廠上的套接字

我的服務器代碼:

var express = require("express"); 
var url = require("url"); 
var app = express(); // express.createServer(); 
var server = require('http').createServer(app); 
var io = require('socket.io').listen(server); 
server.listen(8080); 
app.use(express.static(__dirname + '/public')); 
var MongoClient = require('mongodb').MongoClient 
, format = require('util').format; 

var insertMsg, Collection; 
var socketMap = {}; 

MongoClient.connect('mongodb://127.0.0.1:27017/EladGuy', function(err, db) { 
    if(err) 
     throw err; 
    Collection = db.collection('messages'); 
    console.log("connected to DB"); 
}); 

app.get("/*", function(request, response) { 
    var screen = url.parse(request.url).pathname; 
    check = String(screen).split("="); 
    check2 = String(screen).split("/"); 
    if (check[0] != "/screen" && check2[1] != "html") { 
     response.sendFile(__dirname + '/public/index.html'); 
    } else { 
     if (check[1]>0 && check[1]<4) { 
      saveScreen = check[1]; 
      response.sendFile(__dirname + '/public/oldIndex.html'); 
     } else if (check2[1] == "html") { 
      response.sendFile(__dirname + screen); 
     } else { 
      response.sendFile(__dirname + '/public/index.html'); 
     } 
    } 
}); 

io.sockets.on('connection', function(socket) { 
    socket.on('sendId', function(stationId) { 
     socketMap[parseInt(stationId)] = socket; 
    }); 
    socket.on('getMessages', function(unUsed) { 
     res = []; 
     Collection.find({"screensId":{'$eq': parseInt(saveScreen)}}).toArray(function(err, docs) { 
      docs.forEach(function(doc) { 
       res.push(doc); 
      }); 
      socket.emit('sendMessages', res); 
     }); 
    }); 
    socket.on('getAllMessages',function(unUsed){ 
     res = []; 
     Collection.find().toArray(function(err, docs) { 
      docs.forEach(function(doc) { 
       res.push(doc); 
      }); 
      console.log("STAM CHECK:" + res[0].name); 
      socket.emit('sendAllMessages', res); 
     }); 
    }); 
}); 

main.js代碼(roting,服務和控制器):

var myApp = angular.module('myApp', ['ngRoute']); 

myApp.config(function($routeProvider) { 
    $routeProvider 
     .when('/', 
      { 
       controller: 'HomeController', 
       templateUrl: 'menu.html' 
      }) 
     .when('/stations', 
      { 
       controller: 'StationsController', 
       templateUrl: 'messagesView.html' 
      }) 
     .when('/', 
      { 
       controller: 'HomeController', 
       templateUrl: 'menu.html' 
      }) 
     .otherwise({redirectTo: '/'}); 
}); 
var customersService = function ($http, $q) { 
     var addsFactory = {}; 
     var socket = io.connect('http://localhost:8080'); 
     addsFactory.getMessages = function() { 
      socket.emit('getAllMessages',null); 
      socket.on('sendAllMessages',function (result) { 
       return result; 
      }); 
     }; 
     return addsFactory; 
}; 
    myApp.factory('customersService', ['$http', '$q', customersService]); 


myApp.controller('StationsController',function($scope,customersService){ 
    $scope.messages = []; 
    $scope.messages = customersService.getMessages(); 
}); 

myApp.controller('HomeController',function($scope){ 
    $scope.message="Loaded Menu!!"; 
}); 

能有人爲幫助我知道什麼是我的問題嗎?

+0

沒有返回'getMessages()'。從內部函數返回'不會返回到外部函數,所以'返回結果'什麼都不做 – charlietfl

+0

所以我怎麼能從anonymus函數返回的東西到外部函數? –

+0

可以用作爲參數傳入的回調替換匿名函數。需要使用'$ apply'來告訴角度運行摘要 – charlietfl

回答

-1

你有你的addsFactory.getMessages封裝在一個變量customersService。然後在一個外部函數中,你試圖用customersService.getMessages();來調用它。您定義的方式是customersService本身就是一個函數,其中有一個addsFactory對象,其功能getMessages。你能看到你的函數調用不符合嗎?有各種方法可以彌補這一點。您需要在外部範圍來定義這個功能:

function getMessages(socket) { 
    socket.emit('getAllMessages',null); 
    socket.on('sendAllMessages',function (result) { 
     return result; 
    }); 
}; 

這樣你暴露getMessages功能,以您的控制器,並給它一個socket說法。然後你可以通過getMessages(io.connect('http://localhost:8080');來調用它,並將返回值傳遞給你想要的任何東西。你應該閱讀一些角度最佳實踐。我建議John Papa's style guide

+0

不認爲你已經正確解釋了工廠功能 – charlietfl

+0

你是對的,我沒有注意到他實際上將'customersService'定義爲工廠,仍然是他得到未定義值的原因是他沒有正確引用'addsFactory.getMessages'函數。他可以保持工廠的功能,但是他需要以一種將'getMessages'公開給控制器的方式重寫它。從我所知道的,把這個函數放在一個對象中('addsFactory')沒有任何用處,也沒有注入'$ http'和'$ q' – Haymaker87