如何在backbone.js中进行自定义模型数据解析?

时间:2013-07-26 22:47:52

标签: backbone.js

使用骨干来命中api时,我发现我只需要在响应中包含一些数据。除了有关我不需要的对象的数据之外,Web服务器还给我回传元数据。

以下解决方案有效,但感觉不对。有没有一种标准的方法呢?

var accountsCollection = new AccountsCollection();

accountsCollection.fetch({success : function(collection){
    var results = new AccountsCollection();
    collection.each(function(item){
        results.add(new AccountModel({
            id: item.toJSON().result[0].id,
            messageText: item.toJSON().messageText,
            address1: item.toJSON().result[0].address1,
            address2: item.toJSON().result[0].address2
        }));
    });

    onDataHandler(results);
}});
编辑:根据接受的答案,这是我的最终解决方案:

    parse: function(response) {
        var accounts = [];
        _.each(response['result'], function (account) {
            accounts.push(account);
        });
        return accounts;
    }

1 个答案:

答案 0 :(得分:4)

您可以尝试重写Backbone.Collection.parse方法并执行一些疯狂的下划线操作。不知道它是否适合您的数据..

var keysILike = ['foo', 'bar'];

AccountsCollection.extend({
  parse: function(response) {
    return _.compact(_.flatten(_.map(response, function (model) {
      var tmp = {};
      _.each(_.keys(model), function (key) {
        if (_.contains(keysILike, key)) tmp[key] = model[key];
      })
      return tmp;
    })));
  }
});

关于@ Sushanth的精彩,你肯定想要使用这个解决方案:

var keysILike = ['foo', 'bar'];

AccountsCollection.extend({
  parse: function(response) {
    _.each(response, function (model) {
      _.each(_.keys(model), function (key) {
        if (!_.contains(keysILike, key)) delete model[key]
      })
    });
    return response;
  }
});