我正在尝试使用前端的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);
}
});
},
答案 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);
}
});
},