javascript - 了解 Angular 2 中的可观察对象

标签 javascript angular rxjs observable

我是 Angular 2 和可观察对象的新手。

我有一个带有文本框的 HTML 模板。当可观察对象不返回任何数据时它会被清除,但当数据存在时它会被第一个数据项填充。

即使我已经阅读了有关可观察对象的教程,我也不知道这是怎么发生的。

HTML

<form class="clearfix" role="form"
      [ngFormModel]="basicDetailsForm">
    <div class="form-group col-md-6 no-padding">
        <label for="assignedTo" class="text-muted">Assigned To</label>
        <input class="form-control bold"
               id="assignedTo" 
               type="text" 
               [ngFormControl]="ctrlAssignedTo"
               (change)="assignedToChanged($event)"
               [(ngModel)]="activeItem.assignee.name" />
    </div>
</form>

我的组件 .ts 文件有

.component.ts

 public ngOnInit(): void {

            // subscribe to users observable
            this.usersSubs = this.usersSubs || this.itemDetailService.users$.subscribe(function (user: any) {
                if (user.usedFor !== 'basic') {
                    return;
                }

                if (user.id === '0') {
                    context.activeItem.assignee = {};
                    return;
                }

                let assignedTo: any = {
                    id: user.id,
                    type: 'user',
                    url: user.url,
                    name: user.name,
                    archived: false,
                    archiveDate: null
                }

                context.activeItem.assignee = assignedTo;
            });
        }
 constructor(
        @Inject(AppStateService) public appStateService: AppStateService,
        @Inject(ItemDetailService) public itemDetailService: ItemDetailService,
        private formBuilder: FormBuilder) {
        super(appStateService, itemDetailService);


        this.activeItem = this.activeItem || {
            assignee: {}
        };

        // build the form
        this.basicDetailsForm = this.formBuilder.group({
            'assignedTo': ['']
        });
        this.ctrlAssignedTo = <Control>this.basicDetailsForm.controls['assignedTo'];

    }

我的 service.ts 文件有

.service.ts

 private usersObserver: Observer<any>;

constructor(
    @Inject(ProjectsApiService) private apiService: ProjectsApiService,
    @Inject(AppStateService) private appStateService: AppStateService,
    @Inject(AppObservableService) private appObservableService: AppObservableService) {
    this.activeDetailTab = {
        index: 0
    }
}

public init() {
 this.users$ = this.users$ || new Observable((observer: any) => {
            this.usersObserver = observer;
        }).share();
}

     public getUserByAlias(alias: string, usedFor: string): void {

            let context = this;
            this.apiService.getUserByAlias(alias)
                .subscribe(
                (data: any) => {
                    if (data.data.length === 0) {
                        context.usersObserver.next({ id: '0', usedFor: usedFor });
                        return;
                    }

                    data.data.forEach(function (user: any) {
                        context.users.push(user);
                    });

                    data.data[0].usedFor = usedFor;
                    context.usersObserver.next(data.data[0]);
                },
                err => { console.log(err); },
                () => { console.log('Done'); }
                );
        }

最佳答案

我会试着按照数据流向你解释。因此,让我们从触发流程的因素开始。

您有一个 Input,它会在发生变化时触发 assignedToChanged 事件。

(change)="assignedToChanged($event)"

在 assignedToChanged() 中调用了服务类中的 getUserByAlias() 方法。

您已在上次编辑中删除了这部分代码。

getUserByAlias class apiService.getUserByAlias() 而这里是 observables 介入的地方。

首先让我们了解 getUserByAlias 的作用。如果您了解有关可观察对象的基础知识,您就会知道 .subscribe 在返回 api 响应时被调用。 在 .subscribe 中,您将处理另一个可观察对象,我们很快就会到达那里。但现在我将重点介绍这里发生的三件主要事情。

如果 api 响应中没有数据,id 为 0 的对象将被推送到 userObservable 流中。

if (data.data.length === 0) {
    context.usersObserver.next({ id: '0', usedFor: usedFor });
    return;
}

否则,用户数组将填充所有返回的用户。

data.data.forEach(function (user: any) {
   context.users.push(user);
});

第一个用户被推送到userObserver

data.data[0].usedFor = usedFor;
context.usersObserver.next(data.data[0]);

现在,请注意上面代码片段中的 userObserver。这个观察者是通知文本框的关键。当我们调用 .next() 时,我们将一个新值推送到可观察流中,因此,所有正在收听此可观察数据的人都会收到通知。

但是谁订阅了这个 observable? 在组件内部,您订阅了 userObservable:

this.usersSubs = this.usersSubs || this.itemDetailService.users$.subscribe(function (user: any) {
  //implementation removed for readbility
});

每当将新值插入可观察流(userObservable.next())时,始终会调用 .subscribe() 中的函数

关键是要理解该服务正在公开一个观察者,任何类都可以监听该观察者,并且每当必须发送新值时,该服务将调用 .next('here goes the value|object' ).

关于javascript - 了解 Angular 2 中的可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38306475/

相关文章:

javascript - 无法将旧的 reCaptcha 代码居中

javascript - KineticJS 调整文本大小以适应带有一些填充的矩形内部

javascript - 如何在angular2中的模块之间路由?

css - Angular Material 有顶层布局容器吗?

javascript - 在heroku上运行 Angular 应用程序时出现应用程序错误

rxjs - 如何使用 ReactiveX Observables/Subjects 处理进度更新?

typescript - 类型 'take' 上不存在属性 'FirebaseObjectObservable<any>'

javascript - 在 Javascript 中 - 为调用具有给定参数的函数的按钮设置 onclick 属性

javascript - 如何获取 this.id 的 .index()

javascript - 使用 rxjs 时如何获取错误的堆栈跟踪?