使用角度材料2表根据用户的当前位置显示后端的结果

时间:2017-08-10 15:54:21

标签: angular typescript geolocation angular-material2

这是与Typescript getCurrent location and pass to backend to get the result and pass to Material Table data source几乎相同的问题,但是这个问题我只得到了如何获得当前位置并传递给后端的答案,以及它由libertyernie的回答起作用。所以我问这个......

以下是问题: 我想使用Angular Material 2表来显示餐厅列表(来自我的spring-boot后端)。基于他们在github上提供的教程,数据源必须是可观察的,这是有意义的,因为您可以对列进行排序或过滤类似的数据。但是当我尝试与当前位置集成时,我不知道如何使其工作......

该方案与我链接的问题相同,即尝试获取用户的当前位置,并且一旦获得该位置(例如,lat=123lon=123),我将这两个参数传递到我的后端地址:http://localhost:8080/api/search/location?lat=123&lon=123,这将返回一个餐厅列表,我需要以某种方式更改为Observable,以便connect()中的ExampleDataSource函数有效。

下面的代码就是我已经尝试过的,但是我失败了,数据源什么都没有回来。

import { Component, OnInit } from '@angular/core';
import { Http, Response, URLSearchParams } from '@angular/http';
import { DataSource } from '@angular/cdk';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/startWith';
import 'rxjs/add/observable/merge';
import 'rxjs/add/operator/map';
import { Restaurant } from '../restaurant/restaurant';
import { Category } from '../category/category';
import { RestaurantService } from '../restaurant/restaurant.service';


@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {
  displayedColumns = ['Id', 'Name', 'Category', 'Address', 'City'];
  exampleDatabase: ExampleHttpDatabase | null;
  dataSource: ExampleDataSource | null;
  location: CurrentLocation | null;
  lat: any;
  lon: any;
  result: Promise<any>;

  constructor(http: Http) {
    this.exampleDatabase = new ExampleHttpDatabase(http);
    this.dataSource = new ExampleDataSource(this.exampleDatabase);
    this.location = new CurrentLocation(http);
  }

  ngOnInit() {
    this.result = this.location.getCurrentLocation(this.lat, this.lon);
    this.result.then(function(result){
      console.log(result._body);
    })
    console.log(this.lat, this.lon);
    this.dataSource.connect();
  }
}

export class ExampleHttpDatabase {
  private restaurantUrl = 'api/restaurant'; // URL to web API
  getRestaurants(): Observable<Restaurant[]> {
    var result = this.http.get(this.restaurantUrl)
      .map(this.extractData);
    result.toPromise();
    return result;
  }

  extractData(result: Response): Restaurant[] {
    return result.json().map(restaurant => {
      return {
        id: restaurant.id,
        name: restaurant.restaurant_name,
        category: restaurant.category.map(c => c.categoryName).join(','),
        address: restaurant.address.address,
        city: restaurant.address.city.city_name
      }
    });
  }
  constructor(private http: Http) { }
}

export class CurrentLocation {
  constructor(private http: Http) { }
  private lat: any;
  private lon: any;
  private params = new URLSearchParams();
  private url = 'api/search/location';


  getPosition = () => {
    var latitude, longitude;
    return new Promise((resolve, reject) => {
      navigator.geolocation.getCurrentPosition((position) => {
        resolve(position.coords);
      }, (err) => {
        reject(err);
      });
    })
  }
  async getCurrentLocation(lat, lon): Promise<any> {
    let coords = await this.getPosition();
    lat = this.lat = coords['latitude'];
    lon = this.lon = coords['longitude'];
    this.params.set('lat', this.lat);
    this.params.set('lon', this.lon);
    var result = this.http.get(this.url, { search: this.params });
    return await result.toPromise();
  }
}

export class ExampleDataSource extends DataSource<Restaurant> {
  constructor(private _exampleDatabase: ExampleHttpDatabase) {
    super();
  }

  /** Connect function called by the table to retrieve one stream containing the data to render. */
  connect(): Observable<Restaurant[]> {
    return this._exampleDatabase.getRestaurants();
  }

  disconnect() { }
}

Github中的完整代码:https://github.com/zhengye1/Eatr/tree/dev

1 个答案:

答案 0 :(得分:0)

最后,我可以将信息显示到主页,但发生了奇怪的行为,请看这个链接:Weird behavior when using Angular Material 2 table (Angular 2/Spring Boot backend)