MEAN 堆栈和 socket.io,表达式计算速度太快
MEAN stack and socket.io, expressions evaluate too fast
我很难使用 angular 和 socket.io。
访问页面时,我使用 socket.io 连接到服务器 (Node.js)。服务器从 mongoDB 中提取数据,然后将数据发送回 angular 中写入的客户端,而客户端又应使用 ng-repeat
.
显示数据
admin.hjs
:
<body ng-controller="MainCtrl as mc">
<H1>Admin</H1>
{{mc.msgs.length}}
{{mc.msgs}}
<div ng-repeat="msg in mc.msgs">
{{msg.name}}
</div>
</body>
app.js
:
(function() {
var app = angular.module('msgsSystem', []);
app.controller('MainCtrl', function(){
var ctr = this;
ctr.msgs = [];
var socket = io.connect();
//when receiving the msgs from the server
socket.on('getMsgs', function(data){
ctr.msgs = data;
console.log('gotMsgs');
console.log(ctr.msgs.length);
});
});
})();
访问页面时,我看到 {{mc.msgs.length}} {{mc.msgs}}
被评估为 0 []
,但在控制台中 gotMsgs 6
。我的猜测是页面在响应从服务器返回之前呈现。
如有任何帮助,我将不胜感激。
如果您在异步方法(套接字,ajax)中更新作用域变量,AngularJs 将无法正常工作。 $scope.$apply()
解决了这个问题。
app.controller('MainCtrl', function($scope){
$scope.msgs = [];
var socket = io.connect();
//when receiving the msgs from the server
socket.on('getMsgs', function(data){
$scope.msgs = data;
$scope.$apply();
});
});
})();
我很难使用 angular 和 socket.io。
访问页面时,我使用 socket.io 连接到服务器 (Node.js)。服务器从 mongoDB 中提取数据,然后将数据发送回 angular 中写入的客户端,而客户端又应使用 ng-repeat
.
admin.hjs
:
<body ng-controller="MainCtrl as mc">
<H1>Admin</H1>
{{mc.msgs.length}}
{{mc.msgs}}
<div ng-repeat="msg in mc.msgs">
{{msg.name}}
</div>
</body>
app.js
:
(function() {
var app = angular.module('msgsSystem', []);
app.controller('MainCtrl', function(){
var ctr = this;
ctr.msgs = [];
var socket = io.connect();
//when receiving the msgs from the server
socket.on('getMsgs', function(data){
ctr.msgs = data;
console.log('gotMsgs');
console.log(ctr.msgs.length);
});
});
})();
访问页面时,我看到 {{mc.msgs.length}} {{mc.msgs}}
被评估为 0 []
,但在控制台中 gotMsgs 6
。我的猜测是页面在响应从服务器返回之前呈现。
如有任何帮助,我将不胜感激。
AngularJs 将无法正常工作。 $scope.$apply()
解决了这个问题。
app.controller('MainCtrl', function($scope){
$scope.msgs = [];
var socket = io.connect();
//when receiving the msgs from the server
socket.on('getMsgs', function(data){
$scope.msgs = data;
$scope.$apply();
});
});
})();