GVKun编程网logo

改进此AngularJS工厂以与socket.io一起使用

22

在这篇文章中,我们将带领您了解改进此AngularJS工厂以与socket.io一起使用的全貌,同时,我们还将为您介绍有关AngularJS不适用于IE9,但可以与其他浏览器一起使用、angularj

在这篇文章中,我们将带领您了解改进此AngularJS工厂以与socket.io一起使用的全貌,同时,我们还将为您介绍有关Angular JS不适用于IE9,但可以与其他浏览器一起使用、angularjs – Angular 2 app中的socket.io-client、angularjs – Angular translate指令不与ngMessage一起使用、angularjs – Angular UI:下拉列表不能与datepicker一起使用的知识,以帮助您更好地理解这个主题。

本文目录一览:

改进此AngularJS工厂以与socket.io一起使用

改进此AngularJS工厂以与socket.io一起使用

我想在AngularJS中使用socket.io。我找到了以下工厂:

app.factory(''socket'', function ($rootScope) {    var socket = io.connect();    return {        on: function (eventName, callback) {            socket.on(eventName, function () {                var args = arguments;                $rootScope.$apply(function () {                    callback.apply(socket, args);                });            });        },        emit: function (eventName, data, callback) {            socket.emit(eventName, data, function () {                var args = arguments;                $rootScope.$apply(function () {                    if (callback) {                        callback.apply(socket, args);                    }                });            })        }    };

它在控制器中的使用方式如下:

function MyCtrl($scope, socket) {    socket.on(''message'', function(data) {        ...    });};

问题是每次访问控制器时都会添加另一个侦听器,因此当收到一条消息时,将对其进行多次处理。

将socket.io与AngularJS集成的更好的策略是什么?

编辑:我知道我无法在工厂返回任何东西并在那里进行监听,然后在控制器中使用$ rootScope。$ broadcast和$ scope。$
on,但这看起来不是一个好的解决方案。

EDIT2:添加到工厂

init: function() {            socket.removeAllListeners();}

并在每个使用socket.io的控制器的开头调用它。

仍然感觉不是最好的解决方案。

答案1

小编典典

销毁控制器时,请删除套接字侦听器。您将需要$destroy像这样绑定事件:

function MyCtrl($scope, socket) {    socket.on(''message'', function(data) {        ...    });    $scope.$on(''$destroy'', function (event) {        socket.removeAllListeners();        // or something like        // socket.removeListener(this);    });};

有关更多信息,请查看angularjs文档。

Angular JS不适用于IE9,但可以与其他浏览器一起使用

Angular JS不适用于IE9,但可以与其他浏览器一起使用

因此,我正在开发一个小型应用程序,该应用程序可以从API网址获取此类代码,例如… $
http.get(s_url).then(function(res){…我的应用程序与chrome,safari,opera和firefox兼容但是在IE9中显示黑屏,我的html或js文件中缺少什么吗?这是我在html文件中的IE

    <!--[if lte IE 8]>    <script src="js/json2.js"></script>    <script>        document.createElement(''ng-include'');        document.createElement(''ng-pluralize'');        document.createElement(''ng-view'');        document.createElement(''x-restrict'');        document.createElement(''x-fileupload'');        // Optionally these for CSS        document.createElement(''ng:include'');        document.createElement(''ng:pluralize'');        document.createElement(''ng:view'');        //customized tags        document.createElement(''location'');        document.createElement(''temp'');        document.createElement(''image'');        document.createElement(''caption'');        document.createElement(''temps'');        document.createElement(''remtemps'');    </script>    <![endif]-->    <div ng-view></div></head>

答案1

小编典典

尝试为ng-app和ng-view加上数据前缀,如data-ng-app和data-ng-view一样。

angularjs – Angular 2 app中的socket.io-client

angularjs – Angular 2 app中的socket.io-client

参见英文答案 > How to import socket.io-client in a angular 2 application?4个
我正在尝试在我的angular 2应用程序中使用socket.io客户端并安装它和打字

我只是从’socket.io-client’导入;

但不知怎的,我从中得到了很多错误:

如果我从cdn加载脚本并将init代码放在< script>中,我可以在index.html中使用lib.标签,但我不能在我的实际角度2应用程序中使用它.

我在这做错了什么?

这是我的样板:https://github.com/mgechev/angular2-seed

socket.io的例子似乎已经过时了,这就是我避免它们的原因.

这就是我正在做的并且已经得到了这些错误:

import * as io from 'socket.io-client';
[...]
var socket = io('127.0.0.1');

所以这个问题似乎与SystemJS有关.
这https://github.com/mgechev/angular2-seed/wiki/Add-external-dependency建议我可以添加socket.io-client,它应该自动添加所有依赖项,但事实并非如此.

我已经尝试了完整的例子,但这也无济于事.

我在我的角度2应用程序中使用socket.io客户端,并没有任何问题.首先,您不应该在index.hml中将script标记放入socket.io-client.其次,你需要在system.js配置中使用这些行:
{
  packages: {
      "socket.io-client": {"defaultExtension": "js"}
  },map: {
    "socket.io-client": "node_modules/socket.io-client/socket.io.js"
  }
}

然后你只需使用它:

import * as io from "socket.io-client";
io.connect(url,{ /* ... */ });

angularjs – Angular translate指令不与ngMessage一起使用

angularjs – Angular translate指令不与ngMessage一起使用

来自AngularJS示例的简单输入:
<body ng-controller="myappCtrl">
<form name="myForm">
  <label>Enter your number:</label>
  <input type="number" name="myNumber" ng-model="name" min="{{minvalue}}" max="{{maxvalue}}"/>
  <pre>myForm.myNumber.$error = {{ myForm.myNumber.$error | json }}</pre>
  <pre>myForm.$valid = {{ myForm.$valid | json }}</pre>

  <div ng-messages="myForm.myNumber.$error">
    <div ng-message="number">You did not enter a valid number</div>
    <div ng-message="min">Your field value is lesser minimum value</div>
    <div ng-message="max" translate="FORM.MAXVALUE"></div>
  </div>

</form>

link to plnkr

输入高于5的值时,应显示已翻译的错误消息.
当我使用translate指令时,它不起作用.

从 angular translate github:

这是多个范围的问题,你必须包装它.

<div ng-message="max"><span translate="FORM.MAXVALUE"></span></div>

angularjs – Angular UI:下拉列表不能与datepicker一起使用

angularjs – Angular UI:下拉列表不能与datepicker一起使用

我试图在下拉列表中添加Datepicker,如下所示,并设置autoClose =“outsideClick”.但是,当按下任何月份按钮时,它会切换下拉列表.怎么解决这个?

Html代码:

<divdropdown auto-close="outsideClick">
                <buttondropdown-toggle>Date Picker</button>
                <divrole="menu">
                        <datepicker show-weeks="false" ng-model="dt"></datepicker>
                </div>
</div>

Plunker:http://plnkr.co/edit/lBn3Oo?p=preview

解决方法

您需要手动阻止点击事件冒泡,因此它永远不会到达关闭下拉列表的最顶层节点(文档):

<divdropdown auto-close="outsideClick">
    <buttondropdown-toggle>Date Picker</button>
    <divrole="menu" ng-click="$event.stopPropagation()">
        <datepicker show-weeks="false" ng-model="dt"></datepicker>
    </div>
</div>

注意,ng-click =“$event.stopPropagation()”可以解决问题.

演示:http://plnkr.co/edit/pPwW83Ro0u0g4dVhyZaZ?p=info

今天关于改进此AngularJS工厂以与socket.io一起使用的介绍到此结束,谢谢您的阅读,有关Angular JS不适用于IE9,但可以与其他浏览器一起使用、angularjs – Angular 2 app中的socket.io-client、angularjs – Angular translate指令不与ngMessage一起使用、angularjs – Angular UI:下拉列表不能与datepicker一起使用等更多相关知识的信息可以在本站进行查询。

本文标签: