0

我是 Ember Data 的新手,迄今为止我所做的只是 FIXTURE 数据,但今天我正努力走向真正的交易,并且意识到我对如何连接模型和 API 的了解不够来电签名。

具体来说,我希望能够调用端点GET /activities/[:user_id]/[date]。这将加载一组“活动”对象,但仅加载给定日期的对象。我知道我可以通过以下方式抵消 API 的目录:

 DS.RESTAdapter.reopen({
   namespace: 'api'
 });

在我的情况下,api前缀是合适的。我想我也应该能够通过设置这样的路线来解决日期组件:

this.resource('activities', { path: '/activities' }, function() {
    this.route('by_date', {path: '/:target_date'});
});

以上只是一个有根据的猜测,因为我完全不知道如何将user_id组件放入 URL 签名中。任何人都可以帮忙吗?有没有什么好的教程或基本 Ember Data 用例的示例?

另外,因为我知道我接下来会遇到这个......如何将参数添加到 url 字符串(又名 GET /foobar?something=value)与 URL 本身的参数(如上)?

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 更新 -=-=-=- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

我已经实施了@intuitivepixel 的建议,但仍然遇到一些问题......

首先,我尝试对userIdand的值进行硬编码dateBy

路由器:

this.resource('activities', { path: '/activities' }, function() {
    this.route('by_date', {path: '/:user_id/:by_date'});
});

路线:

App.ActivitiesByDateRoute = Ember.Route.extend({  
    serialize: function(activity) {
      return {
        userId: 1,
        dateBy: "2013-07-01"
      };
    }     
});

可悲的是,这没有奏效。我想我明白为什么——虽然我没有快速的方法来解决这个问题——但对我来说更令人不安的是,当我手动将参数放入 URL: 时http://restful.service.com/api/activities/1/2013-07-01。结果让我很惊讶:

  • 最初调试消息表明成功:
  • 然而,这是不正确的,因为实际上没有发出网络请求
  • 如果您重新加载浏览器,它现在会出去并获取活动,但令我惊讶的是,它也会出去寻找指定的用户。嗯。没关系,用户1被拉回成功。
  • 然而,Activity 只是一个GET /activities失败的调用,因为该端点需要用户和日期限定符才能工作。为什么这些不包括在请求中?
4

1 回答 1

0

我知道我可以通过以下方式抵消 API 的目录:

如果是这种情况,您还可以设置我们 API 的不同 URL:

DS.RESTAdapter.reopen({
  url: 'http://myapihost.com',
  namespace: 'api'
});

这将产生一个类似的 URLhttp://myapihost.com/api/

以上只是一个有根据的猜测,因为我完全不知道如何将 user_id 组件放入 URL 签名中。

按照您的示例并添加user_id动态段,假设您有此路由器映射定义:

this.resource('activities', { path: '/activities' }, function() {
  this.route('byDate', {path: '/:user_id/:target_date'});
});

这是你的{{linkTo}}帮手:

{{#each activity in model}}
  {{#linkTo 'activities.byDate' activity}}
{{/each}}

然后用多个动态段构建你的 url,你可以挂钩到你的路由serialize函数并返回一个由你的 URL 需要的动态段组成的哈希:

App.ActivitiesByDateRoute = Ember.Route.extend({
  serialize: function(activity) {
    return {
      user_id: activity.get('userId'),
      target_date: activity.get('targetDate')
    }
  }
});

上面的代码将在单击链接/activities/[userId]/[targetDate]时生成一个 URL 。{{linkTo}}该示例假定您构建 URL 所需的属性在您的Activity模型中可用。

另外,因为我知道我接下来会遇到这个......如何将参数添加到 url 字符串(又名 GET /foobar?something=value)与 URL 本身的参数(如上)?

ember 框架尚不支持这种 URL 查询,但有一些很好的解决方法/项目可以尝试处理缺少的功能,例如:https ://github.com/alexspeller/ember-query ,如果这个PR得到了有一天合并,那么您很快就会在 ember 中拥有它们,但是暂时您可以使用上述库来支持自定义查询。有关 lib get 是否已合并的当前状态,请查看此处:http ://discuss.emberjs.com/t/query-string-support-in-ember-router正在进行讨论。

希望能帮助到你。

于 2013-08-09T23:04:39.620 回答