AngularJS socket.IO引导模块只有一次

当与NodeJS和socket.io一起使用AngularJS时,我有一个bootstrap模式窗口的问题。 我一直在谷歌search,似乎是问题有一个解决scheme,但由于某种原因,它不起作用,当我试图与Socket.io一起实施它。 我在两个不同的地方使用模式 – 当我点击一个静态的div(完美的作品),当我收到来自webSockets的消息(只打开一次,然后什么也没有)。 我想我可能在我的JS代码有一个问题,因为模式,当我点击一个静态的div工作正常,但我不知道。

我有一个地址,当这个链接被访问时,我通过WebSockets发送一些数据给客户端。 客户端事件如下所示:

socket.on('patient', function(data){ modalInstance = $modal.open({ templateUrl: 'templates/patient.js', controller: 'patientModalCtrl', resolve: { details: function(){return data;} } }); }); 

和:

 socket.on('alergy',function(data){ modalInstance = $modal.open({ templateUrl: "templates/alergy.js", controller: 'alergyModalCtrl' }); }); 

这两个工作只有一次,然后模态窗口停止出现。 有趣的是,当我发出“过敏”,然后再“耐心”,我得到一个“过敏”窗口,然后耐心窗口下面的第二个“过敏”窗口。

发射看起来像这样:

 app.get('/api/socket/hash/:hash', function(req, res){ var hash = req.params.hash; //allergy if(hash === "3fDecCD"){ connected_sockets[0].emit('alergy', {alergy: true}); res.json({status: true}); } //patient detail else if(hash === "Vc43Sf"){ connected_sockets[0].emit('patient', {name: 'Jan', surname: 'Bjornstad'}); res.json({status: true}); } else{ res.json({status: false}); } }); 

我的模板看起来像这样:

 <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"></div> <div class="modal-body" style="background-color: #FFD1D1;"> <h1 style="text-align: center; color: red;">Allergy!</h1> <h2 style="text-align: center; color: red;">The patient is allergic to opium!</h2> </div> <div class="modal-footer"> <button class="btn btn-warning" ng-click="cancel()">Close</button> </div> </div> </div> 

我正在使用AngularJS 1.0.7,Bootstrap CSS 2.3.1

我会说,你的套接字事件监听器正在触发“AngularJS世界之外”,因此AngularJS机器并没有踢入其双向数据绑定“魔术”。 确切地说,你不会进入AngularJS $摘要循环,所以绑定不会被更新,承诺不会被parsing等。

简单的解决方法是将调用的AngularJS特定的代码(这里称为$ modal服务)打包到Scope.$apply method,例如:

 socket.on('alergy',function(data){ $scope.$apply(function(){ modalInstance = $modal.open({ templateUrl: "templates/alergy.js", controller: 'alergyModalCtrl' }); }); });