【问题标题】:Angular 2, subscribe when coordinates are receivedAngular 2,收到坐标时订阅
【发布时间】:2017-02-27 20:58:11
【问题描述】:

我正在学习 Angular 2。我正在使用带有 Observable 的 LocationService,它会在一段时间后将坐标交给我。这是我的代码。

location.service.ts

public getLocation(): Observable<any> {
    return Observable.create(observer => {
        if(window.navigator && window.navigator.geolocation) {
            window.navigator.geolocation.getCurrentPosition(
                (position) => {
                    observer.next(position);
                    observer.complete();
                },
                (error) => observer.error(error)
            );
        } else {
            observer.error('Unsupported Browser');
        }
    });
}

app.component.ts

ngOnInit() {
    this.location.getLocation().subscribe((coordinates) => {
        this.lat = coordinates.coords.latitude;
        this.lng = coordinates.coords.longitude;
    });
}

我如何订阅接收坐标以便我可以渲染地图,添加标记, .. 一旦我从第一次订阅中收到它们。

【问题讨论】:

    标签: javascript angular rxjs angular2-observables


    【解决方案1】:

    首先,我会将该方法放入服务中。

    假设您有一个名为location.service.ts 的文件,该文件中包含export class LocationService,您将拥有以下内容

    getLocation(): Observable<any> {
        return Observable.create(observer => {
            if(window.navigator && window.navigator.geolocation) {
                window.navigator.geolocation.getCurrentPosition(
                    (position) => {
                        observer.next(position);
                        observer.complete();
                    },
                    (error) => observer.error(error)
                );
            } else {
                observer.error('Unsupported Browser');
            }
        });
    }
    

    在您的组件中,您将执行以下操作:

    import { Component, OnInit } from '@angular/core';
    import { LocationService } from '/shared/location.service.ts';
    
    @Component({
      selector: 'app-root',
      templateUrl: './app.component.html',
      styleUrls: ['./app.component.css']
    })
    export class AppComponent implments OnInit {
    
      constructor(private service: LocationService) {}
    
       ngOnInit(){
         this.service.getLocation().subscribe(rep => {
            // do something with Rep, Rep will have the data you desire.
         });
       }
    }
    

    【讨论】:

    • 谢谢!确实如此。我将添加我的 app.component 代码
    • 在我的代码中,我在 app.component 上设置了坐标 lat 和 lng 变量,你会推荐吗?并为地图创建一个新的监听器/可观察者?或者只是在第一个实例的订阅中执行所有逻辑。看起来像乱码,不是吗?
    • 能否粘贴您的 app.component 以便我更好地查看。
    • 我不会说这很混乱,我个人就是这样做的。首先调用一个服务来获取数据,然后在调用的订阅部分对其进行操作。当您离开组件(即转到另一个页面)时,请务必取消订阅。否则,订阅将保持订阅状态,您将遇到内存泄漏。您可以在 ngOnDestroy 生命周期挂钩中取消订阅。
    • @Notflip 只是另一个注意事项,因为我注意到您说您正在学习 Angular2 constructor 仅用于 dependency injection 永远不要使用构造函数进行繁重的工作。如果您需要在请求组件时调用数据库,请在ngOnInit() 中进行设置
    猜你喜欢
    • 2016-10-09
    • 2016-12-24
    • 2018-04-24
    • 2017-10-18
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    相关资源
    最近更新 更多