代码之家  ›  专栏  ›  技术社区  ›  GluePear

服务更新时角度组件未更新

  •  1
  • GluePear  · 技术社区  · 8 年前

    events 具有 delete 方法:

    let EVENTS: TimelineEvent[] = [
        {
          event: 'foo',
          timestamp: 1512205360,
        },
        {
          event: 'bar',
          timestamp: 1511208360,
        }
      ];
    
    @Injectable()
    export class EventsService {
    
      getEvents(): Promise<TimelineEvent[]> {
        return Promise.resolve(EVENTS);
      }
    
      deleteEvent(deletedEvent) {
        EVENTS = EVENTS.filter((event) => event.timestamp != deletedEvent.timestamp);
      }
    }
    

    我的主要组件显示这些事件,并使用 onClick 处理程序调用服务的 deleteEvent 方法:

    @Component({
      selector: 'my-app',
      providers: [EventsService],
      template: `
        <div>
          <event *ngFor="let timelineEvent of events" [timelineEvent]="timelineEvent" [deleteEvent]="deleteEvent"></event>
        </div>
      `,
    })
    export class App implements OnInit {
      constructor(private eventsService: EventsService) {
    
      }
      events
    
      getEvents(): void {
        this.eventsService.getEvents().then(events => this.events = events);
      }
    
      deleteEvent(event): void {
        this.eventsService.deleteEvent(event); 
      }
    
      ngOnInit(): void {
        this.getEvents();
      }
    }
    

    我可以看到 console.logging 这个 EVENTS 已正确更新的数组。但显示未更新。我哪里做错了?

    此处的示例代码: https://plnkr.co/edit/cENnHeHORnDT50RaTyoI .

    1 回复  |  直到 8 年前
        1
  •  1
  •   Faly    8 年前

    您删除了服务中的事件,而不是组件中的事件。组件中的事件列表仍然未更新。

    1-使您的服务返回承诺的deleteEvent方法:

    deleteEvent(deletedEvent) {
        EVENTS = EVENTS.filter((event) => event.timestamp !== deletedEvent.timestamp);
        return Promise.resolve("Successfully deleted");
    }
    

    deleteEvent = (event) => {
        this.eventsService.deleteEvent(event).then(res => this.getEvents()); 
    }