我有一些代码,我只需运行一次,但我不确定该代码属于哪个(服务?工厂?)
这是代码:
socket.on('recv chat', function (data){
$("#chat").append(
"<b><" + data.nick + "></b>: " +
data.texto +
"<br>"
);
});
从代码中可以看出,它只是一个基本的聊天应用程序。我的整个网页都有几个标签,其中一个标签是聊天标签。如果我把这个代码放在我的聊天控制器中,它会在每个tab-switch上执行,所以当有人发送消息时,它会被附加几次。
我应该把它放在哪里才能执行一次?
答案 0 :(得分:1)
你说它应该只执行一次,但大概你想要的只是显示值。如果是这样,显而易见的是代码更新模型然后使用angular的数据绑定来显示。 (角度的一个好的经验法则是除了试图操纵DOM的指令以外的任何地方都可能做错了。)
因此,一些未经测试的代码可能是:
socket.on('recv chat', function (data){
$scope.apply(function() {
$scope.nick = data.nick;
$scope.texto = data.texto;
});
});
你的HTML只有:
<div ng-show="nick"><b><{{nick}}></b>: {{texto}}</div>
我认为您需要在$scope.apply()
中包装模型更新,否则事件将不会在正确的角度上下文中发生。
回答你的意见:
控制器的每个新实例中是否有新的套接字?如果是这样,没有问题,因为最坏的旧事件处理程序更新旧模型,并且当旧套接字消失时应该消失。如果您在控制器之间重新使用套接字,那么我认为您要定义一个服务来处理套接字,您可以在服务中注册回调。
答案 1 :(得分:0)
var stopWatch = $scope.$on('someEvent', function(){
//some code here
stopWatch();
});
答案 2 :(得分:0)
这不是最好的解决方案,但这是迄今为止我遇到过的最佳解决方案。您需要删除已注册的偶数。只需在附加事件之前添加此行。
socket.removeAllListeners();
socket.on('recv chat', function (data){
$("#chat").append(
"<b><" + data.nick + "></b>: " +
data.texto +
"<br>"
);
});