1

我有一些代码只需要运行一次,但我不确定该代码属于哪里(服务?工厂?)

这是代码:

socket.on('recv chat', function (data){
    $("#chat").append(
        "<b>&lt;" + data.nick + "&gt;</b>: " +
        data.texto +
        "<br>"
    );
});

从代码中可以看出,它只是一个基本的聊天应用程序。我的整个网页有几个标签,其中一个标签是聊天标签。如果我将此代码放在聊天的控制器中,它会在每个选项卡开关上执行,因此当有人发送消息时,它会被附加几次。

我应该把它放在哪里让它只执行一次?

4

3 回答 3

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>&lt;{{nick}}&gt;</b>: {{texto}}</div>

我认为您需要将模型更新包装起来,$scope.apply()否则事件将不会在正确的角度上下文中发生。

回复您的评论:

控制器的每个新实例中是否有一个新套接字?如果是这样,则没有问题,因为旧事件处理程序最坏的情况是更新旧模型,并且在旧套接字消失时应该消失。如果您在控制器之间重新使用套接字,那么我认为您想要定义一个服务来处理套接字,并且您可以使用该服务注册回调。

于 2013-07-29T10:13:39.583 回答
0
var stopWatch = $scope.$on('someEvent', function(){
 //some code here
 stopWatch();
});
于 2013-07-29T09:02:13.707 回答
0

这不是最好的解决方案,但这是迄今为止我遇到的最好的工作解决方案。您甚至需要删除已经注册的。只需在附加事件之前添加此行。

socket.removeAllListeners();

socket.on('recv chat', function (data){
    $("#chat").append(
        "<b>&lt;" + data.nick + "&gt;</b>: " +
        data.texto +
        "<br>"
    );
});
于 2016-01-23T04:12:25.067 回答