这与Typescript getCurrent location and pass to backend to get the result and pass to Material Table data source几乎是相同的问题,但是这个问题我只得到了如何获取当前位置并传递到后端的答案,由libertyernie的答案作品。所以我问这一个...使用角度材质2表根据用户当前位置显示来自后端的结果
这是问题: 我想使用Angular Material 2表来显示餐厅(这是来自我的春季启动后端)列表。根据他们在github上给出的教程,数据源必须是可观察的,这是有道理的,因为您可以对列进行排序或过滤数据。但是,当我尝试与当前位置集成时,我不知道如何使其工作...
该方案与我链接的问题相同,即尝试获取用户的当前位置,并且一旦它获得(例如,lat=123
和lon=123
),我会将这两个参数传递到我的后端地址:http://localhost:8080/api/search/location?lat=123&lon=123
,这将返回一个餐厅列表,并且我需要以某种方式更改为Observable,以使ExampleDataSource
中的connect()
函数有效。
下面的代码是我已经尝试过的,但是我失败了,数据源没有任何回应。
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
不知道你是什么在'Observable'中完全改变了,但是如果你正在寻找一个例子来设置'connect()'从API检索数据,你可以检查这个[answer](https://stackoverflow.com/a/45394504/5556177)和[plunker](https://plnkr.co/edit/ivvQqO5dXB92IXN8zOFv?p=preview)。 – Nehal
@Nehal感谢您的评论,让我更容易提出这个问题。我想在用户到达主页时获取用户的当前位置,一旦我的前端获得经纬度,将其发送到后端并返回用户附近的餐馆列表,以便我的前端可以选择结果返回并放入物料表并显示给用户。我该如何解决这个问题? –