0

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

1 回答 1

0

好的,我已经想通了。fetch() 方法有一个可选的“数据”参数,可以传递约束。所以,我的新功能是:

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);
        }
    });
},
于 2012-10-24T10:41:42.330 回答