Angular 2:如何在组件将观察更改的服务中创建一个数组?

Posted

技术标签:

【中文标题】Angular 2:如何在组件将观察更改的服务中创建一个数组?【英文标题】:Angular 2: How to create an array in a service that a component will observe changes to? 【发布时间】:2016-09-15 12:49:36 【问题描述】:

我希望我的NotificationsBellComponent 接收对服务中数组的更改。假设_LocalStorageService 正确地发回数据。

问)我如何让我的组件在服务集合发生更改时接收这些更改?

目前为止的组件:

@Component(
    selector: 'notifications-bell',
    directives: [],
    templateUrl: 'build/components/notificationsBell/notificationsBell.html',
    styles: [`
        button
            background: none !important;
            background-color: none !important;
            box-shadow: none !important;
        
    `]
)
export class NotificationsBellComponent 

    private notifications: string[];

    constructor(
        private _platform: Platform,
        private _nav: NavController,
        private _events: Events,
        private _ConfigService: ConfigurationService,
        private _NotificationService: NotificationService
    ) 
        this.notifications = this._NotificationService.notifications;
    

目前的服务:

@Injectable()
export class NotificationService 

  public notifications: string[];

  constructor(
    private _ConfigService: ConfigurationService,
    private _LocalStorageService: LocalStorageService,
    private _I8nService: I8nService,
    private _events: Events
  ) 
    this.getData();
  

  getData() 
    this._LocalStorageService.getNotifications().then((data) => 
      var list: string[] = [];
      if (data.res.rows.length > 0) 
        for (var i = 0; i < data.res.rows.length; i++) 
          list.push(data.res.rows.item(i).notification);
        
      
      this.notifications = list;
    );
  

  addItem(description: string) 
    this._LocalStorageService.addNotification(description).then(() => 
      this.getData();
    );
  

【问题讨论】:

【参考方案1】:

getData() 在每次 Promise 解决时将 notifications 分配给一个新的 list 数组。您的组件仍将引用原始 list 数组。

不必每次都分配一个新数组,只需将其清除并push() 将新数据放到它上面:

export class NotificationService 
  public notifications: string[];
  getData() 
    this._LocalStorageService.getNotifications().then((data) => 
      this.notifications.length = 0;  // clear array, but keep same reference
      if (data.res.rows.length > 0) 
        for (var i = 0; i < data.res.rows.length; i++) 
          this.notifications.push(data.res.rows.item(i).notification);
        
      
    );
  
  ...

【讨论】:

这样一个简单的解决方案。就我而言,这是一个新手错误,呃......谢谢。【参考方案2】:

通过不在服务中创建数组。

这样做,你“打破了这个可观察序列的链条”:你想要在你的组件中有一个可观察的,你(显然)从你的 LocalStorageService 得到一个可观察的,所以你的目标应该是建模这一直是一个流,而不是在您的服务中分解它。

类似:

@Injectable()
export class NotificationService 

  public notifications$: Observable<string[]>;

   constructor(
     private _ConfigService: ConfigurationService,
     private _LocalStorageService: LocalStorageService,
     private _I8nService: I8nService,
     private _events: Events
   ) 
      this.notifications$ = this._LocalStorageService.getNotifications()
          .map(notifications => 
              // modify the notifications however you need to her
          ) 

   

然后,在您的服务中,您可以subscribe()service.notifications$

【讨论】:

this._LocalStorageService.getNotifications() 返回Promise,而不是Observable 仅供参考。关于此的 2 个问题:1)为什么这比 Mark 下面的答案更好,它有效。 2) 给定你的例子,我如何在我的组件类中subscribe()

以上是关于Angular 2:如何在组件将观察更改的服务中创建一个数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Angular 2中每次路由更改时观察路由更改和布尔变量的更改值?

如何在 Angular 2 中创建单例服务?

如何将可观察值传递给@Input() Angular 4

Typescript Angular - Observable:如何更改其值?

Angular 2 - 如何以特定顺序在组件中实例化多个服务?

如何在 Angular 2 中动态更改 :host 中的 CSS?