【发布时间】:2015-11-18 20:08:58
【问题描述】:
我正在学习如何使用 node.js、angular.js 和 socket.io 开发一个实时网站,并且像这样相对快速地启动和运行:
html
<div ng-controller="myController">
<p> {{name}} = {{value}} </p>
</div>
客户端 js
var app = angular.module("myApp",[]);
var socket = io()
app.controller("myController", function($scope, $http) {
$http.get("myData").then(function(response){
$scope.name = response.data.name
$scope.value= response.data.value
});
socket.on('myDataSocketMsg', function(message){
$scope.$apply(function(){
$scope.name = message.name
$scope.value = message.value
});
});
});
服务器端 js
// data from text file
function getDataFromFile() {
data = JSON.parse(fs.readFileSync('dataFile'));
io.socket.emit("myDataSocketMsg",data)
};
fs.watchFile('dataFile', function(curr, prev) {
getDataFromFile();
});
getDataFromFile();
// router
app.get('/myData', function(req, res){
res.json(data);
});
如您所见,它在页面首次加载时使用 get 请求填充 html,并在服务器中的 json 更改时使用套接字消息将更新推送到视图。如果我不在客户端中使用 get 请求,那么 html 在页面首次加载时不包含任何数据。当然,当我更新数据文件时,套接字仍然会更新它。
这对我来说感觉很笨拙,因为我必须在服务器和客户端上做两次事情:服务器必须通过路由器使 json 可用并通过套接字消息发送它。并且客户端必须处理将数据解析为套接字和获取请求的 $scope.name 和 $scope.value。
是否有更好/更优雅/最佳实践方法来实现这一目标?有没有办法摆脱获取请求来初始填充 html 的需要?
【问题讨论】:
标签: angularjs node.js socket.io