【发布时间】:2018-07-14 11:54:25
【问题描述】:
我知道这个问题已经被问过好几次了,但问题是没有人试图制作一些小提琴或显示代码结果。这就是我所拥有的,我需要根据其他组件中的值更新其他组件中的值,但这不仅仅是值,我在其他一些组件中再次调用函数。 我有一些组件可以访问数据库并更新值,另一方面,我还有其他组件可以从服务中的数据库中读取这些值。 这是我的代码示例
tasks.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import { environment } from '../../environments/environment';
import { Tasks } from './tasks';
@Injectable()
export class TasksProvider {
constructor(private http: HttpClient) { }
createNewTask(name: Name) : Observable<any> {
return this.http.post(environment.apiUri + 'tasks', { name, finished: false },
{ responseType: 'text' });
}
updateTask(id: Id, name: Name, finished: boolean) : Observable<any> {
return this.http.put(environment.apiUri + 'tasks/' + id, { name, finished },
{ responseType: 'text' });
}
getAllTasks(): Observable<Tasks[]> {
return this.http.get(environment.apiUri + 'tasks')
.map<any, Tasks[]>(data => data.map(Tasks.fromObject));
}
}
app.component.html
<app-tasks-list></app-tasks-list>
<app-tasks-add-new></app-tasks-add-new>
如你所见,我没有子组件,这是我的主要问题
tasks-list.component.ts
import {Component} from '@angular/core';
import { Tasks } from '../services/tasks';
import { TasksProvider } from '../services/tasks.service';
@Component({
selector: 'app-tasks-list',
templateUrl: './tasks-list.component.html',
styleUrls: ['./tasks-list.component.scss']
})
export class TasksListComponent {
tasks: Array<Tasks>;
constructor(private tasksProvider: TasksProvider) { }
ngOnInit() {
this.getTasksList();
}
displayedColumns: string[] = ['id', 'name', 'finished'];
private getTasksList() {
this.tasksProvider.getAllTasks()
.subscribe(tasks => {
this.tasks = tasks;
});
}
public updateCheckboxValue(id: number, name: string, event: any){
this.tasksProvider.updateTask(id, name, event.checked).subscribe(
result => {},
() => {
alert('Something went wrong');
})
}
}
tasks-add-new.component.ts
import { Component, OnInit, Inject } from '@angular/core';
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
import { Tasks } from '../services/tasks';
import { TasksProvider } from '../services/tasks.service';
export interface DialogData {
name: string;
}
@Component({
selector: 'app-tasks-add-new',
templateUrl: './tasks-add-new.component.html',
styleUrls: ['./tasks-add-new.component.scss']
})
export class TasksAddNewComponent implements OnInit {
ngOnInit() {
}
constructor(public dialog: MatDialog, private tasksProvider: TasksProvider) {}
openDialog(): void {
const dialogRef = this.dialog.open(TasksAddNewDialog, {
width: '250px',
data: {name: this.animal}
});
dialogRef.afterClosed().subscribe(result => {
this.name = result
this.tasksProvider.createNewTask(this.name).subscribe(
result => {},
() => {
alert('Something went wrong');
})
}
}
}
@Component({
selector: 'tasks-add-new-dialog',
templateUrl: 'tasks-add-new-dialog.html'
})
export class TasksAddNewDialog {
constructor(
public dialogRef: MatDialogRef<TasksAddNewDialog>,
@Inject(MAT_DIALOG_DATA) public data: DialogData) {}
onNoClick(): void {
this.dialogRef.close();
}
}
你现在看到当我在 tasks-add-new.component.ts 中调用函数时像
this.tasksProvider.createNewTask(this.name).subscribe(
result => {},
() => {
alert('Something went wrong');
})
我需要再次调用 tasks-list.component.ts
中的函数 private getTasksList() {
this.tasksProvider.getAllTasks()
.subscribe(tasks => {
this.tasks = tasks;
});
}
有没有人知道我怎样才能做到这一点的最佳实践?
【问题讨论】:
-
"这就是我所拥有的,我需要根据其他组件中的值更新其他组件中的值,但这不仅仅是值,我在其他一些组件中再次调用函数。我有一些用于数据库和更新值的组件,另一方面,我还有其他组件从服务中读取数据库中的这些值。” - 我无法理解这一点 - 您要解决的问题是什么?
-
怎么做?在某些组件中更新数据库,然后在其他组件中读取更新的值?
-
我猜你可以使用 Serrvice——它们是单例的,所有组件都可以访问。 angular.io/tutorial/toh-pt4
-
你能回答我的问题吗?
-
你必须实现
publish/subscribe模式,可以使用Subject或BehaviourSubject来实现
标签: javascript angular angular5 observable