Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 角度2路线之间的通过对象_Sockets_Angular_Routes - Fatal编程技术网

Sockets 角度2路线之间的通过对象

Sockets 角度2路线之间的通过对象,sockets,angular,routes,Sockets,Angular,Routes,试图找到如何在路由之间传递公共对象的答案 我有一个存储socket.io的服务 我需要在我的整个站点上访问该套接字服务,以便我可以监听发射 我有一个route.ts文件,不知道如何在根目录中初始化套接字服务,然后在需要时将其传递给路由 我已经阅读了这些文档,并尝试在route.ts文件中使用如下数据: const routes: RouterConfig = [ { path: '', component: AppComponent }, { path: 'function1'

试图找到如何在路由之间传递公共对象的答案

我有一个存储socket.io的服务

我需要在我的整个站点上访问该套接字服务,以便我可以监听发射

我有一个route.ts文件,不知道如何在根目录中初始化套接字服务,然后在需要时将其传递给路由

我已经阅读了这些文档,并尝试在route.ts文件中使用如下数据:

const routes: RouterConfig = [

    { path: '', component: AppComponent },
    { path: 'function1', component: Function1Component, data: { socket: socket }},
];
但是我不知道在哪里声明套接字服务


谢谢

在您的例子中,您正试图从路由的
数据
选项传递一些函数引用(它将返回object/promise/observable),因此在
数据
选项中传递它将不起作用,因为当您通过执行
this.routerData.get('socket')
请求数据时,它会将数据字符串化

我强烈建议在此处使用路由的
resolve
选项
resolve
方法将返回
promise
/
observable

代码

@Injectable()
class SocketResolver implements Resolve {
  constructor(private socketService: socketService) {}
  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<any> {
    return this.socketService.connection();
  }
}

const routes: RouterConfig = [
    { path: '', component: AppComponent },
    { path: 'function1', component: Function1Component, 
       resolve: { socket: SocketResolver }
    }
];
@Injectable()
类SocketResolver实现解析{
构造函数(私有socketService:socketService){}

解析(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察的

您不应该在这一过程中涉及路由。 只需创建一个服务:

SocketService.ts

import { Injectable } from '@angular/core';

@Injectable()
export class SocketService {
  ...
}
并通过构造函数将该服务注入组件或其他服务:

constructor(private socketService:SocketService) { }
此外,您还可以确保在引导过程中初始化您的服务:

bootstrap(AppComponent, [  
    SocketService,
    ... ]);

在引导过程中,angular将创建服务的单个实例,该实例将被注入到构造函数中包含该实例的每个组件中,因此您可以从任何地方访问相同的套接字服务。

听起来像是要创建服务。如果您在引导过程中提供该实例,则相同的实例将在中可用只要使用类型创建构造函数参数,您的任何组件都可以。看看这是否可行,如果我想编辑来自不同路由的另一个路由组件内的变量如何。如果某些服务只需要在某些路由上加载,而不需要在所有路由上加载,又该怎么办?如果我引导它,它是否会占用路由上的内存不需要该服务的原因是什么?该服务将在应用程序的整个生命周期中一直存在于应用程序内存中。问题是,如果您希望始终有一个打开的套接字,您需要它。如果不需要,您可以通过提供程序:[SocketService]将该服务仅注入所需的组件中在@Component注释中..请注意,这将始终导致socketservice的新实例。如果要编辑组件B中组件A的数据,或者反之亦然,可以使用共享服务(在引导函数中初始化)然后将数据存储在那里。或者,如果它是一个并行子组件之类的东西,您可以使用事件发射器