【问题标题】:Using foursquare API with Angular在 Angular 中使用foursquare API
【发布时间】:2016-04-18 09:16:22
【问题描述】:

我在弄清楚如何在我的 Angular 应用程序中使用 Foursquare API (search capability) 时遇到问题。

我的项目结构是这样的

app
  components
    app.ts
    search.ts
  services
    foursquare.ts
  typings
  boot.ts
index.html

foursquare.ts 看起来像这样

import {Injectable, Inject} from 'angular2/core';
import {Http, Response, RequestOptions, Headers, Request, RequestMethod} from 'angular2/http';

import 'rxjs/add/operator/map';

const CLIENT_ID = 'My client id';
const SECRET = 'My secret';
const URL : string = 'https://api.foursquare.com/v2/venues/search?client_id='+CLIENT_ID+'&client_secret='+SECRET+'&v=20130815';

@Injectable()
export class FoursquareService {

 constructor(public http:Http) {
   this.http = http;
 }

 foursquareGet(data) {
   return this.http.get(URL+data).map(res => res.json());
 }
}

我正在尝试通过以下方式在 search.ts 中使用它

import {Component} from 'angular2/core';
import {FoursquareService} from '../../services/foursquare'

@Component({
  templateUrl : 'app/components/new-listing/new-listing.html',
  providers : [FoursquareService]
})

export class NewListingComponent {
  constructor(service : FoursquareService) {
    console.log(service.foursquareGet('&ll=40.7,-74&query=sushi'));
  }
}

这会返回一个 Observable 内部控制台,我不知道如何使用它,并且希望它返回一个符合条件的 JSON 对象数组。我正在尝试关注这方面的文档,但不知道下一步该做什么。

【问题讨论】:

    标签: angular api foursquare


    【解决方案1】:

    使用订阅:

    service.foursquareGet('&ll=40.7,-74&query=sushi').subscribe(data=> this.data=data);
    

    【讨论】:

    • 对数据抛出错误(在类型 NewListingComponent 上不存在)
    • 将数据定义为成员变量,或者用它做其他事情。
    【解决方案2】:

    是的,Http 类的 get 方法返回一个 observable。您可以明确订阅它并在模板中使用结果:

    export class NewListingComponent {
      constructor(service : FoursquareService) {
        service.foursquareGet('&ll=40.7,-74&query=sushi')
           .subscribe(data => {
             this.result = data;
           });
      }
    }
    

    您还可以通过利用 async 管道让它处理 observable 更进一步。在这种情况下,您可以将 observable 设置为组件的属性:

    @Component({
      template: `
        <ul>
          <li *ngFor="#elt of result | async">{{elt.something}}</li>
        </ul>
      `
    })
    export class NewListingComponent {
      constructor(service : FoursquareService) {
        this.result = service.foursquareGet('&ll=40.7,-74&query=sushi');
      }
    }
    

    这个答案可以给你更多的提示:How to Consume Http Component efficiently in a service in angular 2 beta?

    希望对你有帮助 蒂埃里

    【讨论】:

    • 哪里是定义结果变量的正确位置?
    • 既然你想在你的组件中使用它,它必须是它的一部分。我的意思是类属性。它隐含在我提供的代码中。但是您可以明确定义它:result: ResultClass[]; 就在 export class NewListingComponent 行的下方。
    • 我明白了,关于最后一个问题,我假设需要为 RequestClass 添加一个导入?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多