$scope.receivefb = function receivefb(){
var url ="js/db.php";
$http.post(url).success(
function(data){
console.log(data);
if(data.msg!=""){
document.getElementById('messages').innerHTML += '<div class="row message-body"><div class="col-sm-12 message-main-receiver"><div class="receiver"><div class="message-text" name="messaggio" id='+data.id+'>'+data.msg+'</div><span class="message-time pull-right">Sun</span></div></div></div>';
}
$timeout($scope.receivefb, 2000);
})
}
我正在使用这个javascript函数每2秒调用一个php脚本,它从db获取最后一条消息,然后我打印它。我没有使用这个超时的东西,相反,我想使用一种始终监听的脚本,并在每次检测到新消息时触发我的javascript。 这个概念非常简单,但我不知道如何解决这个问题。
答案 0 :(得分:1)
实际上,如果您没有向服务器发出请求,或者服务器通过某些Web套接字或“web-socket式”技术通知客户端,则无法检测是否有新消息。
至少有两种解决方案:
1)使用socket.io开发服务器端web-socket app,绑定到某个消息事件并将新消息放入$scope.messages
数组,将呈现逻辑委托给angular。优点是它基于事件工作并具有“实时性”,缺点是你要学习nodejs并拥有nodejs服务器(简单廉价的灯服务器托管可能没有nodejs支持)。
2)或者只是简单地每2秒轮询一次与渲染逻辑分开的消息,并将新消息发送到$scope.messages
,将渲染逻辑委托给angular(观察ng-repeat tutorials):
JS部分(MessagesController
内部):
$scope.messages = [];
function receivefb(scope) {
var url ="js/db.php";
$http
.post(url)
.success(function(data) {
if(response.msg != '') {
scope.messages.push(data);
}
})
.finally(function() {
(function(method, scope) {
setTimeout(function(){
method(scope);
}, 2000)
)(receivefb, scope);
});
}
receivefb($scope);
HTML部分:
<div ng-controller="MessagesController">
<div ng-repeat="message in messages" class="row message-body">
<div class="col-sm-12 message-main-receiver">
<div class="receiver">
<div class="message-text" name="messaggio" id="{{message.id}}">
{{message.msg}}
</div>
<span class="message-time pull-right">Sun</span>
</div>
</div>
</div>
</div>