【问题标题】:Backbone Sub-Collections & Resources骨干子集合和资源
【发布时间】:2013-05-14 02:05:08
【问题描述】:

我正在尝试找出一个可以处理检索的集合/模型系统 给定上下文的数据,例如:

可用的“根”资源:

/api/accounts
/api/datacenters
/api/networks
/api/servers
/api/volumes

可用的“子”资源:

/api/accounts/:id
/api/accounts/:id/datacenters
/api/accounts/:id/datacenters/:id/networks
/api/accounts/:id/datacenters/:id/networks/:id/servers
/api/accounts/:id/datacenters/:id/networks/:id/servers/:id/volumes
/api/accounts/:id/networks
/api/accounts/:id/networks/:id/servers
/api/accounts/:id/networks/:id/servers/:id/volumes
/api/accounts/:id/servers
/api/accounts/:id/servers/:id/volumes
/api/accounts/:id/volumes

然后,鉴于 Collection/Model 系统,我将能够执行以下操作:

// get the first account
var account = AccountCollection.fetch().first()

// get only the datacenters associated to that account
account.get('datacenters')

// get only the servers associated to the first datacenter's first network
account.get('datacenters').first().get('networks').first().get('servers')

不确定这是否有意义,所以如果我需要澄清任何事情,请告诉我。

我之所以能够做到这一点,最大的原因在于,如果 提出请求(即account.get('datacenters').first().get('networks')) 尚未制作(该数据中心的网络未加载到客户端上) 它是当时制作的(或者可以是fetch()d?)

如果您能提供任何帮助,我们将不胜感激!

【问题讨论】:

    标签: javascript ajax html rest backbone.js


    【解决方案1】:

    您可以将选项传递给 fetch,这些选项将被转换为查询字符串参数。

    例如:

    // get the first account
    var account = AccountCollection.fetch({data: {pagesize: 1, sort: "date_desc"}});
    

    将转化为:

    /api/accounts?pagesize=1&sort=date_desc
    

    它不是一个非常流畅的 DSL,但它具有表现力和效率,因为它只传输请求的对象而不是过滤获取后的对象。

    编辑:

    您可以延迟加载您的子集合并使用相同的 fetch params 技术按查询字符串条件过滤您的列表:

    var Account = Backbone.Model.extend({
      initialize: function() {
        this.datacenters = new Datacenters;
        this.datacenters.url = "/api/account/" + this.id + '/datacenters';
      }  
    });
    

    然后从帐户实例:

    account.datacenters.fetch({data: {...}});
    

    Backbone docs 关于获取嵌套模型和集合

    【讨论】:

    • 对,这在我过滤帐户时有效,但我希望能够这样做:AccountCollection.fetch().first().get('instances') 这将进行以下调用:/api/accounts 然后/api/accounts/:first_id/instances 并且把这些实例还给我。
    • 用延迟加载方法更新了我的答案。您将需要使用 Promise 或回调来处理路由器中的流控制,但希望这将提供要点。
    • 这更接近了,但我希望我可以进行某种自动类型交易,在其中我可以定义类似于gist.github.com/anonymous/d0229026e5a3c08d7426 的集合/模型,然后它会弄清楚如何连接每个集合/模型的segment 并制作快乐。
    • 在我忘记提及的要点上要记住一点:反向关系不如正向关系重要。这只是一个想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多