backbone.js:在执行列表GET时如何发送约束

时间:2012-10-24 08:23:35

标签: backbone.js

我正在尝试使用前端的backbone.js和backbone-relational.js构建一个应用程序,并在后端运行由Pyramid / Cornice / SQLAlchmeny运行的RESTful api。

在这个阶段,我有两个模型,客户端(基本上是商家)和资产(企业拥有的资产)......最终将有许多其他模型,用于用户,网站等。简化两个模型的例子:

Client:
  id
  name

Asset:
  id
  make
  model
  purchase_cost
  client_id

现在,我的backbone.js代码当前从服务器获取这些模型的数据时工作正常;我有两个列表视图,一个显示所有客户端的列表,另一个显示所有资产的列表。

我现在的问题是,当我点击其中一个客户端时,在客户列表中,我希望它然后显示仅包含属于该特定客户端的资产的列表。没有问题的服务器端部分,它只是一个filter(),我的问题是,如何让backbone.js在请求资产列表时发送这样的约束?

(虽然我在下面的代码中使用了RelationalModel,但我还在学习它并且还没有真正弄清楚如何使用它)

window.Asset = Backbone.RelationalModel.extend({
    urlRoot:"/api/assets",
    defaults:{
        "id":null,
        "make":null,
        "model":null,
        "purchase_cost":null,
    },
    relations: [{
        type: Backbone.HasOne,
        type: Backbone.HasOne,
        key: 'client_id',
        relatedModel: Client
    }]
});

window.AssetCollection = Backbone.Collection.extend({
    model: Asset,
    url: "/api/assets"
});

window.Client = Backbone.RelationalModel.extend({
    urlRoot:"/api/clients",
    defaults:{
        "id":null,
        "name":null
    }
});

window.ClientCollection = Backbone.Collection.extend({
    model: Client,
    url: "/api/clients"
});

我认为我不需要在这里显示任何视图。

在我的路由器中,我目前有一个listClients函数和一个listAssets(见下文)函数,我想我需要添加一个listAssetsforClient(clientid)函数,但我不确定我的意思是什么使用clientid,以便在获取资产列表时,backbone.js会将其作为约束发送到服务器。我认为无论需要做什么都将在AssetCollection模型中,但我看不到Collection API中看起来合适的任何内容。有一些方法可以对已经获取的列表进行过滤,但是当我只需要它们的一个子集时,获取整个资产列表(最终可能有数千个)似乎效率低下,并且可以使服务器到达过滤器。

listAssets: function() {
    $('#header').html(new AssetHeaderView().render().el);
    this.assetList = new AssetCollection();
    var self = this;
    this.assetList.fetch({
        success:function () {
            self.assetListView = new AssetListView({model:self.assetList});
            $('#sidebar').html(self.assetListView.render().el);
            if (self.requestedId) self.assetDetails(self.requestedId);
        }
    });
},

1 个答案:

答案 0 :(得分:0)

好的,我已经弄清楚了。 fetch()方法有一个可选的'data'参数,可以传递约束。所以,我的新功能将是:

listAssetsforClient: function(id) {
    $('#header').html(new AssetHeaderView().render().el);
    this.assetList = new AssetCollection();
    var self = this;
    this.assetList.fetch({
        data: { clientid: id },
        success:function () {
            self.assetListView = new AssetListView({model:self.assetList});
            $('#sidebar').html(self.assetListView.render().el);
            if (self.requestedId) self.assetDetails(self.requestedId);
        }
    });
},