2012-11-27 17 views
5

में डेटा उपलब्ध नहीं है मैंने यादृच्छिक अंतराल पर कुछ डेटा निकालने के लिए अपना नोड सर्वर सेट किया है, और डेटा क्लाइंट/ब्राउज़र पर जा रहा है; हालांकि, मैं यह नहीं समझ सकता कि मेरे ऐप के नियंत्रक में इसका उपयोग कैसे किया जाए।Node.js + AngularJS + Socket.io: धक्का नियंत्रक

#node.js file: /server.js (truncated for brevity) 

var http = require('http').createServer(handler),//refers to handler() 
    fs  = require('fs'), 
    io  = require('socket.io').listen(http); 
http.listen(8000); 

… 

io.sockets.on('connection', function (socket) { 
    /* DUMMY CODE: this generates fake alerts at random intervals */ 
    (function loop() { 
     var rand = Math…; 
     … 
     setTimeout(function(){ 
      … 
      var alert = { … }; 

      socket.emit('alert', { 
       "alert": alert 
      });//socket.emit() 

      loop(); 
     }, rand); 
    }()); 
});//io.sockets.on() 

जब मैं टर्मिनल के लिए alert प्रवेश करते है, यह इस तरह दिखता है:

alert: { 
    id: 258, 
    lat: -95.20933, 
    long: 37.027676, 
    neighbourhood: "Downtown", 
    time: //stringified js timestamp 
} 

और arguments नीचे से डेटा मैं चाहता हूँ (मूल रूप से alert के रूप में ही) शामिल हैं।

# /app/js/services.js 

angular.module('BAR.services' , []) 
.factory('socketio', function($rootScope){ 

    var socket = io.connect(); 
    return { 
     on: function(event, callback) { 
      socket.on(event, function(){ 
       //console.log(arguments); 
       $rootScope.$apply(function(){ 
        callback.apply(socket, arguments); 
       });//$rootScope.$apply() 
      });//socket.on() 
     },//on 
     emit: function(event, data, callback) { 
      socket.emit(event, data, function(){ 
       //console.log(arguments); 
       $rootScope.$apply(function(){ 
        if (callback) callback.apply(socket, arguments); 
       });//$rootScope.$apply() 
      });//socket.emit() 
     },//emit 
     disconnect: function() { 
      socket.disconnect(); 
     } 
    }//return 

});// AlertServices 

हालांकि, मैं समझ नहीं मेरी नियंत्रक में arguments से डेटा का उपयोग करने के लिए कैसे: जब मैं नियंत्रक में यहाँ ब्राउज़र की कंसोल के लिए data लोग इन

# /app/js/controllers.js 

function Alerts($scope , socketio) { 

    socketio.on('alert', function(data) { 
     console.log(data);  /* I expect this to be the data I want */ 
     $scope.alert = data.alert; 
    }); 

    $scope.disconnect = function(){ 
     socketio.disconnect(); 
    } 

} 
Alerts.$inject = ['$scope','socketio']; 

, मैं एक बहुत बड़ा मिलता है ऑब्जेक्ट जो $scope का अभिभावक प्रतीत होता है; और data.alert अपरिभाषित है। मैंने यह socketio.on('alert', function(data , args) जैसे दूसरे पैरामीटर को निर्दिष्ट करने का भी प्रयास किया है, यह सोचकर arguments हो सकता है (क्योंकि callback.apply(…) सेवाओं में 2 है), लेकिन जब मैंने इसे कंसोल पर किया और लॉग किया, args अपरिभाषित लौटा।

बीटीडब्ल्यू, मैं इसे AngularJS इंटर्न द्वारा a tutorial पर आधारित करता हूं। अलग-अलग टुकड़ों के समान नाम थे, इसलिए मुझे यह पता लगाने में थोड़ा परेशानी थी कि प्रत्येक अलग-अलग peices क्या किया (यह भी मददगार नहीं था कि यह जेड में था)।

मैं वास्तव में क्या करना चाहता हूं alert से डेटा के साथ मेरे दृश्य में बाध्यकारी अद्यतन करना है।

उत्तर

5

अपने on और emit कार्यों में, आप का उपयोग कर रहे:

socket.on(event, function() { 
    $rootScope.$apply(function() { 
    callback.apply(socket, arguments); 
    }); 
}); 

लेकिन ट्यूटोरियल से इस के मूल संस्करण में, यह कहते हैं:

socket.on(eventName, function() { 
    var args = arguments; 
    $rootScope.$apply(function() { 
    callback.apply(socket, args); 
    }); 
}); 

var args = arguments महत्वपूर्ण है, क्योंकि यह args को socket.on पर कॉलबैक में दिए गए तर्कों के लिए सेट करता है (जो डेटा आप ढूंढ रहे हैं)। इस चरण के बिना, जब आप वास्तव में arguments का उपयोग करते हैं, तो यह $rootScope.$apply पर कॉलबैक में दिए गए तर्कों का समाधान करता है (जो एक कोणीय दायरा according to the documentation है, यह बताते हुए कि आपको कंसोल आउटपुट क्यों मिलता है)।

socket.on(event, function() { 
    var args = arguments; 
    $rootScope.$apply(function() { 
    callback.apply(socket, args); 
    }); 
}); 
+0

हे भगवान अब है कि समझ में आता है:

समाधान $apply करने के लिए कॉल के बाहर बहस पर कब्जा करने और अपने कॉलबैक में उन पारित करने के लिए किया जाएगा। मैं सोच रहा था कि उसने केवल एक बार इसका इस्तेमाल करने के लिए तर्कों को निर्दिष्ट करने पर परेशान क्यों किया। मैं सुबह में कोशिश करूंगा। धन्यवाद! – jacob

+2

यहां उस आलेख के लेखक: यह सही उत्तर है। – btford

+0

Hazzaaah! इसने काम कर दिया। धन्यवाद! – jacob