【问题标题】:Angular 2, communication between 2 apps running on the same page [duplicate]Angular 2,在同一页面上运行的两个应用程序之间的通信[重复]
【发布时间】:2016-06-03 09:50:24
【问题描述】:

我正在寻找一种让两个 Angular 2 应用程序相互通信的方法。我发现我可能应该做一个共享服务。

我的main.ts

import { bootstrap }    from '@angular/platform-browser-dynamic';
import { LoginComponent } from './login.component';
import { ShoppingListComponent } from './shopping-list.component';

bootstrap(LoginComponent);
bootstrap(ShoppingListComponent);

我已经做了服务user.service.ts

export class UserService {
  authenticated: boolean;
  constructor() { }

  setAuthenticated(authenticated) {
    this.authenticated = authenticated
  }

  isAutheticated() {
    return this.authenticated;
  }
}

有没有办法在两个组件之间共享此服务?

解决方案

我找到了另一种使用工厂的方法:

main.ts

import { bootstrap }    from '@angular/platform-browser-dynamic';
import { bind } from '@angular/core';
import { LoginComponent } from './login.component';
import { ShoppingListComponent } from './shopping-list.component';
import { UserService } from './services/user.service';
import { UserServiceFactory } from './factories/UserServiceFactory';

bootstrap(LoginComponent,[bind(UserService).toFactory(UserServiceFactory)]);
bootstrap(ShoppingListComponent,[bind(UserService).toFactory(UserServiceFactory)]);

UserServiceFactory.ts

import { UserService } from '../services/user.service';

var sdInstance = null;

export function UserServiceFactory() {
   if(sdInstance == null) {
        sdInstance = new UserService();
   }

   return sdInstance;
}

更新

正如 cmets 中所说,bind() 已弃用。

main.ts

import { bootstrap }    from '@angular/platform-browser-dynamic';
import { provide } from '@angular/core';
import { LoginComponent } from './login.component';
import { ShoppingListComponent } from './shopping-list.component';
import { UserService } from './services/user.service';
import { UserServiceFactory } from './factories/UserServiceFactory';

bootstrap(LoginComponent, [provide(UserService, {useFactory:UserServiceFactory})]);
bootstrap(ShoppingListComponent, [provide(UserService, {useFactory:UserServiceFactory})]);

【问题讨论】:

    标签: typescript angular


    【解决方案1】:

    简短的回答是你不能。

    也就是说,您可以共享一个实例并在引导两个组件时使用它。

    这是一个示例:

    var service = new SharedService();
    
    bootstrap(LoginComponent, [
      provide(SharedService, { useValue: service })
    ]);
    bootstrap(ShoppingListComponent, [
      provide(SharedService, { useValue: service })
    ]);
    

    【讨论】:

    • 感谢您的回答,这真的对我有用。在网上搜索了一番后,我找到了一个和你类似的答案。您可以创建工厂并使用绑定函数,而不是创建实例:kbyte.snowpenguin.org/portal/en/2015/10/29/… Cheers!
    • 不客气!请注意,bind 函数已被弃用,取而代之的是 provide 一个 ;-) 但您仍然可以实现工厂方法!
    猜你喜欢
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 2016-02-27
    • 2011-08-06
    • 2019-10-27
    • 2012-12-28
    • 1970-01-01
    相关资源
    最近更新 更多