可以从Angular2中的“InMemoryWebApiModule”转换?

时间:2016-11-02 17:44:22

标签: angular angular2-http

我已经实施了一个基于“英雄之旅”tutorial的项目。我已经达到了我想要开始使用真正的REST后端的程度,但理想情况下我只想通过操作来执行此操作。

我更新了post调用以使用我的REST服务的URL,如下所示:

create(hero: Hero): Promise<Hero> {
    return this.http
        .post("http://127.0.0.1:3001/api/heroes", JSON.stringify(hero), {headers: this.headers})
        .toPromise()
        .then(res => return res.json().data)
        .catch(this.handleError);
}

问题是,这仍然只能点击InMemoryDbService提供的InMemoryWebApiModule。事实上,我提供的URL无关紧要 - 只要它以/heroes结尾,它就有效。我可以输入任何端口号,任何路径和任何IP(只要它是以/heroes结尾的可解析URL)。

我希望HttpModule能够正常工作,InMemoryWebApiModule只会在网址解析为应用程序的网址时被点击。显然事实并非如此,只是在模块中导入InMemoryWebApiModule.forRoot(InMemoryDataService)会改变Http的工作方式(据我所知)。

所以我的问题是 - 在转换到真实服务时,是否可以继续使用InMemoryWebApiModule来托管模拟服务?你如何修改“英雄之旅”教程来完成一次操作呢?

1 个答案:

答案 0 :(得分:5)

您可以将选项配置对象传递给InMemoryWebApiModule.forRoot。其中一个配置是passThruUnknownUrl。将其设置为true,如果无法找到模拟数据中的集合,它将使用正常XHRBackend

imports: [
  InMemoryWebApiModule.forRoot(MockData, {
    passThruUnknownUrl: true
  })
]

因此,在开发过程中,随着在后端创建新集合,您可以开始在前端删除它们

createDb() {
  let cats = [];
  let dogs = [];
  return {
    cats,
    // dogs
  }
}

最初,内存中将处理网址/api/cats/api/dogs。但是我们可以说现在在后端创建了dogs集合。您只需从上面返回的集合中删除dogs,现在内存中会将这些调用转发到正常XHRBackend,以便进行XHR调用。