代码之家  ›  专栏  ›  技术社区  ›  Nick Hodges

为什么我的角度页面在使用EventEmitter时不刷新?

  •  0
  • Nick Hodges  · 技术社区  · 6 年前

    当我的EventEmitter发射事件时,我的角度SPA不会刷新。

    EventEmitter

    import { Component, OnInit, Output, EventEmitter } from '@angular/core';
    import { Todo } from '../todo';
    
    @Component({
      selector: 'app-add-todo',
      templateUrl: './add-todo.component.html',
      styleUrls: ['./add-todo.component.css']
    })
    export class AddTodoComponent implements OnInit {
      newTodo: Todo = new Todo();
    
      @Output() addTodoEvent: EventEmitter<Todo> = new EventEmitter();
    
      constructor() { }
    
      addTodo() {
        this.addTodoEvent.emit(this.newTodo);
        console.log('event emitted');
        this.newTodo = new Todo();
        console.log('new todo created');
      }
    
      ngOnInit() {
      }
    
    }
    

    以下是使用它的模板:

    <div class="container">
      <app-add-todo (addTodoEvent)='onAddTodo($event)'></app-add-todo>
       // other template stuff
    </div>
    

    onAddTodo :

      onAddTodo(todo: Todo) {
        console.log('onAddTodo called');
        this.todoDataService.addTodo(todo);
      }
    

    基本上,应用程序是可以工作的,但是在做了任何更改之后,我必须按F5来刷新页面。

    我很乐意提供任何可能需要的进一步信息。

    更新:

    addTodo :

      addTodo(todo: Todo): void {
        this.aHttpService.post<Todo>(`http://localhost:3000/todos`, todo).subscribe(
          val => {
            console.log('POST call successful value returned in body', val);
          },
          response => {
            console.log('POST call in error', response);
          },
          () => {
            console.log('The POST observable is now completed.');
          }
        );
      }
    

    import { Component, OnInit } from '@angular/core';
    import { Todo } from '../todo';
    import { TodoDataService } from '../todo-data.service';
    import { Observable } from 'rxjs/Observable';
    
    @Component({
      selector: 'app-todo-list',
      templateUrl: './todo-list.component.html',
      styleUrls: ['./todo-list.component.css']
    })
    export class TodoListComponent implements OnInit {
      constructor(private todoDataService: TodoDataService) {}
    
      completetodos: Observable<Array<Todo>>;
      incompletetodos: Observable<Array<Todo>>;
    
      onAddTodo(todo: Todo) {
        console.log('onAddTodo called');
        this.todoDataService.addTodo(todo);
      }
    
      toggleTodoComplete(todo) {
        this.todoDataService.toggleTodoComplete(todo);
      }
    
      removeTodo(todo) {
        this.todoDataService.deleteTodoById(todo.id);
      }
    
      editTodo(todo: Todo) {
        todo.editMode = true;
      }
    
      updateTodo(todo: Todo, editInput) {
        todo.title = editInput.value;
        todo.editMode = false;
        this.todoDataService.updateTodoById(todo.id, todo);
      }
    
      allTasks(): Observable<Array<Todo>> {
        return this.todoDataService.getAllTodos();
      }
    
      completedTodos(): Observable<Array<Todo>> {
        return this.todoDataService.completedTodos();
      }
    
      incompletedToDos(): Observable<Array<Todo>> {
        return this.todoDataService.incompletedTodos();
      }
    
      ngOnInit() {
        this.completetodos = this.completedTodos();
        this.incompletetodos = this.incompletedToDos();
      }
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Jameel Moideen    6 年前

    一旦成功保存todo,就必须更新observates

     onAddTodo(todo: Todo) {
    this.todoDataService.addTodo(todo).subscribe(
          val => {
             // here you have to update the observables //incompletetodos.next(newTodo)
          },
          response => {
            console.log('POST call in error', response);
          },
          () => {
            console.log('The POST observable is now completed.');
          }
        );
    }
    

    你也不需要在这里订阅

     addTodo(todo: Todo): void {
        return this.aHttpService.post<Todo>(`http://localhost:3000/todos`, todo);
      }
    

    How can I append items to Observable

    如果您使用BehaviorSubject(另一种类型的observeable)而不是observeable,那么您可以轻松地添加一个新项。像下面这样

    incompletetodos: BehaviorSubject<Array<Todo>> = BehaviorSubject.empty<Array<Todo>>();
    

    //你可以像下面这样推送一个新项目

     incompletetodos.next(newTodo)
    
        2
  •  1
  •   You Nguyen    6 年前

     addTodo(todo: Todo): void {
        return this.aHttpService.post<Todo>(`http://localhost:3000/todos`, todo);
     }
    

    在组件中使用它:

     onAddTodo(todo: Todo) {
        this.todoDataService.addTodo(todo).subscribe(val => {
           this.incompletetodos.push(val);
        });;
     }
    


    参考文献: https://angular.io/tutorial/toh-pt6#add-a-new-hero

    src/app/heroes/heroes.component.ts(添加)

    add(name: string): void {
      name = name.trim();
      if (!name) { return; }
      this.heroService.addHero({ name } as Hero)
        .subscribe(hero => {
          this.heroes.push(hero);
        });
    }
    

    src/app/hero.service.ts(添加hero)

    /** POST: add a new hero to the server */
    addHero (hero: Hero): Observable<Hero> {
      return this.http.post<Hero>(this.heroesUrl, hero, httpOptions).pipe(
        tap((hero: Hero) => this.log(`added hero w/ id=${hero.id}`)),
        catchError(this.handleError<Hero>('addHero'))
      );
    }
    

    为什么我的角度页面在使用EventEmitter时不刷新?

    基本上,应用程序可以工作,但我必须按F5刷新

    ngOnInit() {
        this.completetodos = this.completedTodos();
        this.incompletetodos = this.incompletedToDos();
    }
    

    因此,应用程序将反映数据库的最新数据。

    需要注意的一点是,在我使用数组时,这一点通常是有效的 作为一个数据源,但当我转到json服务器和Observables时, 这个 页面已停止刷新 .

    实际上,当您使用数组作为数据源时,我们的应用程序根本不会刷新。这是我的电话 数据绑定