繁体   English   中英

如何在Angular中从Service到Component调用函数?

[英]How do I call a function from Service to Component in Angular?

我正在尝试学习Angular,并且已经建立了一个闹钟。 我给用户提供了一个复选框,以选择要取消的警报,我把它当作英雄使用,以后在this.ui()中使用; 存储在我的本地存储中。

但是删除该元素后,我的看法没有改变。 我怎么做?

1)我想调用我的函数ui(); 服务完成发布警报后,在组件中单击。

2)如何递归调用函数?

这是我的register.component.ts

import { Component, OnInit } from '@angular/core';
import {ValidateService} from '../../services/validate.service';
import {AlarmService} from '../../services/alarm.service';
import {FlashMessagesService} from 'angular2-flash-messages';
import {Router} from '@angular/router';

@Component({
  selector: 'app-register',
  templateUrl: './register.component.html',
  styleUrls: ['./register.component.css']
})
export class RegisterComponent implements OnInit {

   hours;
   id: String;
   timeid: String;
   time;
   heroes: any[];
   name:string;
   hero = [1,2,3,4,5].map(id => <any>{id:id, time: new Date(2017,5,id)})


  constructor(
    private validateService: ValidateService, 
    private FlashMessage: FlashMessagesService,
    private Router: Router,
    private AlarmService: AlarmService
    ) { 

      }

  ngOnInit() {

     this.ui();
  }


  ui(){
    setTimeout(() => {
     this.heroes = JSON.parse(localStorage.getItem('users'));
     console.log(this.heroes);
       }, 100);  
  }

  check(e){
    console.log(e);
    console.log(e.target.checked);
    console.log(e.target.value);

     let get = JSON.parse(localStorage.getItem('users'));
     for(var i= get.length -1 ; i > -1; i--) {
          if(get[i].id == e.target.value) {
              get.splice(i, 1);
          }
      }
     localStorage.setItem('users', JSON.stringify(get)); 

     console.log(get); 

     this.ui();

     let time = new Date().getTime()

     this.AlarmService.setUpAlarms(time);
  }
}

这是我的警报服务。

import { Injectable } from '@angular/core';
import {FlashMessagesService} from 'angular2-flash-messages';


@Injectable()
export class AlarmService {
   constructor(private FlashMessage: FlashMessagesService) {}

   setUpAlarms(time: number){


    var storage =  JSON.parse(localStorage.getItem('users'));
    var alarms = [];
    var miliseconds = [];
    var eventNow = new Date();
      for(var i=0; i < storage.length; i++){
        var eventEndTime = storage[i]['hours'];
      var flag = storage[i]['flag'];
        if (eventEndTime >= new Date()) {
          alarms.push(storage[i]);
          var duration = eventEndTime.valueOf() - eventNow.valueOf();
          miliseconds.push(duration);
          miliseconds = miliseconds.sort((a, b) => a - b);
      }
      }
      console.log(miliseconds);
      localStorage.setItem('users', JSON.stringify(alarms));

       for(var i =0; i< miliseconds.length; i++){
          setTimeout(() => {
            this.FlashMessage.show('ALARM CLOCK WAKE UP', {cssClass: 'alert-danger', timeout: 10000});

            }, miliseconds[i]);    

            return;              
       }
     }
  }

尽管从服务中调用组件中的方法不是更好的方法,但是仍然可以使用Subject来实现。

import { Injectable } from '@angular/core';
import {FlashMessagesService} from 'angular2-flash-messages';
import { Subject } from 'rxjs/Subject';

@Injectable()
export class AlarmService {
   constructor(private FlashMessage: FlashMessagesService) {}

  // Observable string sources
  private compInstance= new Subject<any>();
  // Observable string streams
  comp$ = this.compInstance.asObservable();

   setUpAlarms(time: number){
    var storage =  JSON.parse(localStorage.getItem('users'));
    var alarms = [];
    var miliseconds = [];
    var eventNow = new Date();
      for(var i=0; i < storage.length; i++){
        var eventEndTime = storage[i]['hours'];
      var flag = storage[i]['flag'];
        if (eventEndTime >= new Date()) {
          alarms.push(storage[i]);
          var duration = eventEndTime.valueOf() - eventNow.valueOf();
          miliseconds.push(duration);
          miliseconds = miliseconds.sort((a, b) => a - b);
      }
      }
      console.log(miliseconds);
      localStorage.setItem('users', JSON.stringify(alarms));

       for(var i =0; i< miliseconds.length; i++){
          setTimeout(() => {
            this.FlashMessage.show('ALARM CLOCK WAKE UP', {cssClass: 'alert-danger', timeout: 10000});

            }, miliseconds[i]);    

       this.compInstance.next();        // Notify alarm published
            return;              
       }
     }
  }

在你的组件中

this.AlarmService.comp$.subscribe(
        () => {
            this.ui()
        }
);

参考: https : //angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM