4

我的 API 的一部分设置如下:

/v1/place/:place_uuid- 检索一个地方

/v1/place/:place_uuid/cart- 检索与该地点关联的购物车对象

我的路线设置正确(见下文),但 Ember 发出的 API 请求与我自己的不匹配。

App.Router.map(function() {
    this.resource('place', { path: '/:place_uuid' }, function() {
        this.resource('category', { path: '/:category_uuid' }, function() {
            this.resource('product', { path: '/:product_uuid' });
        });
        this.resource('cart', { path: '/cart' });
    });
});

当我/:place_uuid在浏览器中加载时,我看到一个正确的 API 请求/v1/place/:place_uuid。路由与返回的对象一起呈现。

当我在浏览器中加载/:place_uuid/cart时,我看到与上面相同的内容,但还有第二个 API 请求/v1/carts。除了/v1/cartsURL 之外,这一切都很好。我需要它/v1/place/:place_uuid/cart

我尝试将 buildURL 与 Cart 模型的自定义适配器一起使用。但没有运气。我无法在下面的任何地方访问 place_uuid,因此无法将其注入。

cartAdapter = App.Adapter.extend({
  buildURL: function(record, suffix) {
    console.log(record); // just a string. 
    var url = [this.url];
    url.push('places');
    url.push(place_uuid); // if only I had access to place_uuid I could inject it here
    url.push('cart');
    return url.join("/");
  }
});
App.Store.registerAdapter('App.Cart', cartAdapter);

如果我可以使用我原来的 API 端点那就太好了,我想另一种选择是将端点更改为/v1/carts?place_uuid=:place_uuid(Ember 似乎更喜欢,但有点棘手,因为我不在后端工作)。

任何建议表示赞赏。

4

3 回答 3

4

Ember 尚不支持嵌套的 REST URL/资源。您可以监控此功能的未解决问题。

于 2013-05-06T18:31:23.433 回答
1

这是我的方法:

像这样修补你的 DS.Store:

import DS from 'ember-data';

export default {
  name: 'patches',

  initialize: function() {
      // +++ Nested routes +
      DS.Store.reopen({
          __nestedAdapter__: null,

          nest: function(type) {
              this.set('__nestedType__', this.adapterFor(type));
              return this;
          },

          withResources: function(resources) {
              this.get('__nestedType__').set('nestedResources', resources);
              this.set('__nestedType__', null);
              return this;
          }
      });
  }
};

将此添加到您的适配器:

import DS from 'ember-data';

export default DS.RESTAdapter.extend({

    nestedResources: {},

    buildURL: function(type, id, record) {
        var resources = this.nestedResources;
        var parts = [this.get('host')];

        for(var key in resources) {
            if (resources.hasOwnProperty(key)) {
                var resource = resources[key];
                parts.push(
                    Ember.Inflector.inflector.pluralize(key)
                );
                if(isNaN(resource)) {
                    parts.push(resource.get('id'));
                } else {
                    parts.push(resource)
                }
            }
        }

        parts.push(
            Ember.Inflector.inflector.pluralize(type),
            id
        );

        this.set('nestedResources', {});
        console.log(parts.join('/'));
        return parts.join('/');
    }

});

使用富有表现力的语法:

that.store.nest('user').withResources({comment: comment}).find('user')

这肯定可以缩短,但我喜欢这样。

于 2014-09-16T15:52:48.760 回答
1

无耻的插头:)

我写了https://github.com/amiel/ember-data-url-templates来帮助解决这种情况。它适用于较新版本的 ember-data。有了它,您可以执行以下操作:

App.CartAdapter = App.ApplicationAdapter.extend({
  queryUrlTemplate: "/v1/place/{placeId}/cart",

  urlSegments: {
    placeId(type, id, snapshot, query) {
      return query.placeId;
    }
  }
});


// in the route
this.store.query('cart', { placeId: placeId });

我希望这会有所帮助:)

于 2016-01-08T00:04:42.237 回答