在AngularJS中只运行一次代码

时间:2013-07-29 08:16:45

标签: javascript html5 angularjs

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

这是代码:

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

从代码中可以看出,它只是一个基本的聊天应用程序。我的整个网页都有几个标签,其中一个标签是聊天标签。如果我把这个代码放在我的聊天控制器中,它会在每个tab-switch上执行,所以当有人发送消息时,它会被附加几次。

我应该把它放在哪里才能执行一次?

3 个答案:

答案 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>&lt;{{nick}}&gt;</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>&lt;" + data.nick + "&gt;</b>: " +
        data.texto +
        "<br>"
    );
});