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

Obseravables服务-误解/最佳实践

  •  1
  • vitalragaz  · 技术社区  · 7 年前

    我正在努力解决两个组件之间的观察服务方法。我有一个包含设置组件的概要文件组件。两者都使用用户。在应用程序中定义提供者的服务。单元未在其他任何地方定义提供程序。因此,当我更改设置上的名字作为示例时。组件并将其保存。更改不会反映在配置文件中。组件侧栏,直到我重新加载页面。

    下班时间: 我找到了一个在eventemitter上实现这一点的解决方案,它将在更新发生时立即触发。这可以解决我上面的问题,但我认为这不是正确的方式,因为我读了下面的文章:

    What is the proper use of an EventEmitter?

    如果没有活动主持人,它不应该工作吗?

    所以我的问题是: 在这种情况下,您会使用什么方法,或者最佳做法是什么?当然,我的代码中可能存在问题。我真的是个新手。

    应用程序。单元ts

    在应用程序中。单元ts i定义:

     providers: [UserService]
    

    轮廓组成部分ts

    @Component({
        selector: 'app-profile',
        templateUrl: './profile.component.html',
        styleUrls: ['./profile.component.css']
    })
    
    export class ProfileComponent implements OnInit {
        user: any;
        Role = Role;
        constructor(private _userService: UserService, ) { }
    
    
        ngOnInit() {
            const token = localStorage.getItem('token');
            const role = jwt.decode(token).user.role;
            this._userService.getUser().subscribe(v => { this.user = v; });
            // Event Emmiter Subscription
            this._userService.change.subscribe(v => { this.user = v; });
        }
    }
    

    轮廓组成部分html

    <div *ngIf="user" class="container mt50">
        <div class="row profile">
            <div class="col-md-3">
                <div class="profile-sidebar">
                    <!-- SIDEBAR USERPIC -->
                    <div class="profile-userpic">
                        <img gravatar [email]="user.email" [size]="256" class="img-responsive animated bounceIn" alt="">
                    </div>
                    <!-- END SIDEBAR USERPIC -->
                    <!-- SIDEBAR USER TITLE -->
                    <div class="profile-usertitle">
                        <div class="profile-usertitle-name">
                            {{ user.firstName }} {{ user.lastName }}
                        </div>
                        <div class="profile-usertitle-job">
                            {{ user.email }}
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-md-9">
                    <app-profile-settings-admin *ngIf="user.role === Role.ADMINISTRATOR"></app-profile-settings-admin>
            </div>
        </div>
    </div>
    

    使用者服务ts

    @Injectable()
    export class UserService {
        public user: any;
    
        constructor(private http: Http) { }
        // EVENT EMIITER
        public change: EventEmitter<any> = new EventEmitter();
        getUser() {
            const token = localStorage.getItem('token')
                ? '?token=' + localStorage.getItem('token')
                : '';
            return this.http.get('api/user' + token)
                .map((response: Response) => {
                    this.user = response.json().obj;
                    return this.user;
                })
                .catch((error: Response) => Observable.throw(error.json()));
        }
    
        updateUser(user) {
            const body = JSON.stringify(user);
            const headers = new Headers({'Content-Type': 'application/json'});
            const token = localStorage.getItem('token')
                ? '?token=' + localStorage.getItem('token')
                : '';
            return this.http.patch('api/user/' + token, body, {headers: headers})
                .map((response: Response) => {
                    const result = response.json();
                    this.user = result.obj;
                    // EMIT EVENT
                    this.change.emit(this.user);
                    return this.user;
                })
                .catch((error: Response) => Observable.throw(error.json()));
        }
    }
    

    轮廓设置。管理组成部分ts

    在该组件中,只有一个表单可以在提交时触发以下代码:

    onSubmit() {
        this._userService.updateUser(this.userForm.value)
            .subscribe(
                data => {
                    this._toastyService.default('Settings saved!');
                    console.log(data);
                },
                error =>{
                    this._toastyService.default('Error occured!');
                    console.log(error);
                }
            );
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Luillyfe    7 年前

    Live working example 无需触发事件即可在组件之间共享(和同步)数据。让Angular services(和Angular forms)为您控制:

    轮廓组成部分

    ngOnInit() {
        const token = localStorage.getItem('token');
        const role = jwt.decodeToken(token).user.role;
        this._userService.getUser().subscribe(v => {
            this.user = v; 
        });
    }
    

    使用者服务

    getUser() {
        const token = localStorage.getItem('token')
            ? '?token=' + localStorage.getItem('token')
            : '';
        return this.http.get('api/user' + token)
            .pipe(map((user: HttpResponse<any>) => {
                this.user = user;
                    return this.user;
                }),
            catchError((error: HttpErrorResponse) => Observable.throw(error)))
    }
    
    updateUser(user) {
        const body = JSON.stringify(user);
        const headers: HttpHeaders =  new HttpHeaders({'Content-Type': 'application/json'});
        const token = localStorage.getItem('token')
            ? '?token=' + localStorage.getItem('token')
            : '';
        return this.http.patch('api/user/' + token, body, {headers})
            .pipe(map((user: HttpResponse<any>) => {
                this.user = user;
                return this.user;
            }),
            catchError((error: HttpErrorResponse) => Observable.throw(error)));
    }
    

    轮廓设置。管理组成部分ts

    ngOnInit() {
        this._userService.getUser().subscribe((user: User) => {
            this.user = user;         
        });
    }
    
    onSubmit() {
        this._userService.updateUser(this.user)
            .subscribe(
                data => {
                    this._toastyService.default('Settings saved!');
                    console.log(data);
                },
                error =>{
                    this._toastyService.default('Error occured!');
                    console.log(error);
                }
            );
    }
    

    轮廓设置。管理组成部分html

    <form #userForm="ngForm">
        <div class="form-group">
            <label for="name">Name</label>
            <input type="text" class="form-control" id="name" aria-describedby="nameHelp" 
                placeholder="enter name" [(ngModel)]="user.name" name="name" required #name="ngModel">
            <div [hidden]="name.valid || name.pristine"
                class="alert alert-danger">
                Name is required
            </div>
        </div>
         <div class="form-group">
            <label for="lastName">Last Name</label>
            <input type="text" class="form-control" id="lastName" aria-describedby="lastNameHelp" 
                placeholder="enter last name" [(ngModel)]="user.lastName" name="lastName" required #lastName="ngModel">
            <div [hidden]="lastName.valid || lastName.pristine"
                class="alert alert-danger">
                last Name is required
            </div>
        </div>
        <div class="form-group">
            <label for="email">Email</label>
            <input type="email" class="form-control" id="email" aria-describedby="emailHelp" 
                placeholder="enter email" [(ngModel)]="user.email" name="email" required #email="ngModel">
            <div [hidden]="email.valid || email.pristine"
                class="alert alert-danger">
                email is required
            </div>
        </div>
    
        <button type="submit" class="btn btn-success" (click)="onSubmit()" >Submit</button>
    </form>