2017-10-09 70 views
0

我正在通过ng-bootstrap模式添加我的数据,但是由于当我点击添加按钮时,它需要刷新才能看到新添加的数据。我已经叫this.getMaterials()当我成功添加的产品,但它仍然需要被刷新之前,我可以看到新增加的数据需要重新加载浏览器才能看到角度的变化

export class MaterialsListComponent implements OnInit { 
    closeResult: string; 
    materials: any; 
    subscription: Subscription; 

    constructor(private modalService: NgbModal, private materialsService: MaterialsService) { } 

    ngOnInit() { 
    this.getAllMaterials(); 
    } 

    getAllMaterials() { 
    this.subscription = this.materialsService.getAll() 
     .subscribe(
      (data:any) => { 
      this.materials = data; 
      console.log(data); 
      }, 
      error => { 
      console.log(error); 
      }); 
    } 

    onCreateMaterial(form: NgForm){ 
    const name = form.value.name; 
    const description = form.value.description; 
    this.materialsService.addMaterial(name, description) 
     .subscribe(
      data => { 
      this.getAllMaterials(); 
      console.log(data); 
      }, 
      error => { 
      console.log(error); 
      }); 
    } 

    open(content) { 
     this.modalService.open(content).result.then((result) => { 
     this.closeResult = `Closed with: ${result}`; 
     }, (reason) => { 
     this.closeResult = `Dismissed ${this.getDismissReason(reason)}`; 
     }); 
    } 

    private getDismissReason(reason: any): string { 
     if (reason === ModalDismissReasons.ESC) { 
     return 'by pressing ESC'; 
     } else if (reason === ModalDismissReasons.BACKDROP_CLICK) { 
     return 'by clicking on a backdrop'; 
     } else { 
     return `with: ${reason}`; 
     } 
    } 

    ngOnDestroy() { 
    this.subscription.unsubscribe(); 
    } 

} 

服务

export class MaterialsService { 
    url = AppSettings; 
    materials: any; 

    constructor(private httpClient: HttpClient) {} 

getAll() { 
    if(!this.materials) { 
     this.materials = this.httpClient.get<any>(this.url) 
          .map((response => response)) 
          .publishReplay(1) 
          .refCount(); 

    } 
    return this.materials; 
    } 

    addMaterial(name: string, description: string) { 
    return this.httpClient 
    .post(
     this.url, 
     JSON.stringify({ name, description}) 
    ) 
    .map((response: any) => { 
     return response; 
     }); 
    } 
+0

您应该使用RxJs主题实时更新数据。 http://reactivex.io/documentation/subject.html –

+0

@HaHoang。如果你能用我的代码来帮助我,那将是非常棒的。谢谢 –

回答

0

我不知道你的服务在做什么。

因此,在你MaterialsService,你应该声明BehaviorSubject如下:

import { Injectable } from '@angular/core' 
import { BehaviorSubject } from 'rxjs/BehaviorSubject' 

@Injectable() 
export class MaterialsService { 
    materials: Observable<any[]> // any : your data type 
    // store data 
    private store: { 
    materials: any[] 
    }; 
    private _source: BehaviorSubject<any[]>; 

    constructor(private http: Http) { 
    this._source = <BehaviorSubject<any[]>>new BehaviorSubject([]); 
    this.store = { materials: [] }; 

    this.materials = this._source.asObservable(); 
    } 

    getAll() { 
    this.http.get(`${this.baseUrl}/materials`).map(response => response.json()) 
     .subscribe(materials => { 
     this.store.materials= materials; 

     this._source.next(Object.assign({}, this.store).materials); 
    }, error => console.log('Could not load materials.')); 
    } 

    addMaterial(name, description) { 
    this.http.post(`${this.baseUrl}/materials`, JSON.stringify({name, description})) 
     .map(response => response.json()).subscribe(data => { 
     this.store.materials.push(data); 

     this._source.next(Object.assign({}, this.store).materials); 
    }, error => console.log('Could not add material.')); 
    } 
    ... 
} 

在你MaterialsListComponent,您订阅的可观察:

export class MaterialsListComponent implements OnInit { 
    materials: Observable<any[]>; 

    constructor(private modalService: NgbModal, 
       private materialsService: MaterialsService) { } 

    ngOnInit() { 
    this.materials = this.materialsService.materials; 
    } 
} 

每次有来自发出的新的价值我们的Observable Angular更新了视图。

<!-- Async pipe is used to bind an observable directly in your template --> 
<div *ngFor="let item of materials | async"> 
    {{ item.name }} 
</div> 

希望得到这个帮助!

+0

我已经添加了我的服务。你能帮忙吗?谢谢 –

+0

您是否尝试按照我的回答进行一些更改? –

+0

还没有。我在哪里把网址? –

0

我你需要在模态关闭时调用getAllMaterial()(假设用户通过打开的模态添加了一些材质)

open(content) { 
     this.modalService.open(content).result.then((result) => { 
     this.closeResult = `Closed with: ${result}`; 
     this.getAllMaterials(); 
     }, (reason) => { 
     this.closeResult = `Dismissed ${this.getDismissReason(reason)}`; 
     }); 
} 
相关问题