我正在尝试在前端使用backbone.js 和backbone-relational.js 构建应用程序,并在后端使用由Pyramid/Cornice/SQLAlchmeny 运行的RESTful api。
在这个阶段,我有两个模型,Client(基本上是企业)和 Asset(企业拥有的资产)......最终会有许多其他模型,用于用户、站点等。两种型号:
Client:
id
name
Asset:
id
make
model
purchase_cost
client_id
现在,我的backbone.js 代码在从服务器从这些模型中获取数据时工作正常;我有两个列表视图,一个显示所有客户端的列表,另一个显示所有资产的列表。
我现在的问题是,当我在客户端列表中单击其中一个客户端时,我希望它只显示属于该特定客户端的资产的列表。服务器端部分没有问题,它只是一个过滤器(),我的问题是,我如何让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);
}
});
},