Backbone - 为模型内的Fetch声明默认参数

时间:2012-12-18 23:04:43

标签: javascript backbone.js backbone-collections

每次调用集合上的fetch时,我都会发送一些全局参数...我的问题是我不想每次获取时都声明data: { ... }

有没有办法可以在Collection本身内部提供默认参数,可以添加更多或覆盖一些?

例如:

而不是每次都这样做:

this.articlesCollection.fetch({
    dataType: 'jsonp',
    data: {
        deviceType: GlobalVars.deviceType,
        memberId: GlobalVars.memberId,
        authToken: GlobalVars.authToken,
        targetObjectId: userId,
        limit: 50,
        excludeArticleBodies: true,
        excludeViewedItems: false
    },
    success: function() {
        _this.render();
    }
});

我想提供一个或两个参数和一个成功函数,如下所示:

this.articlesCollection.fetch({
    data: {
        targetObjectId: userId
    },
    success: function() {
        _this.render();
    }
});

...并让Collection看起来像:

define([
  'underscore',
  'backbone',
  'global',
  'utilities',
  'models/article/ArticleModel'
], function(_, Backbone, GlobalVars, Utils, ArticleModel){

  var ArticlesCollection = Backbone.Collection.extend({

      model: ArticleModel,

      initialize : function(view) {
          this.view = view;
      },

      dataType: 'jsonp',
      data: {
          deviceType: GlobalVars.deviceType,
          memberId: GlobalVars.memberId,
          authToken: GlobalVars.authToken,
          limit: 50,
          excludeArticleBodies: true,
          excludeViewedItems: false
       },

      url : function() {
        return GlobalVars.baseAPIUrl + '/API/GetArticles';
      },

      parse : function(data) {  
        return data.Articles;
      }     

  });

  return ArticlesCollection;

});

2 个答案:

答案 0 :(得分:3)

这是一个有效的jsFiddle,有一种方法:http://jsfiddle.net/LEuGq/1/

基本上,您将defaultParamsparams的对象配置为集合的属性,用于在调用fetch()时动态计算正确的URL。这种方式可能更多地与骨干一致,而不是将fetch()的API更改为接受参数,而这并不是设计用的。

var ParamCollection = Backbone.Collection.extend({

    defaultParams: {deviceType: 'raceCar', limit: 42},
    params: {},
    url: function() {
      return "/paramcollection?" + $.param(_.defaults(this.params, this.defaultParams));
    }
});
var paramCollection = new ParamCollection();
paramCollection.params.excludeArticleBodies = true;
paramCollection.params.limit = 52;
$("#debug").append(paramCollection.url());

答案 1 :(得分:1)

Backbone默认使用jQuery的ajax调用,因此您可以使用各种方法设置您需要的任何默认设置。请参阅此问题以获取一些示例:jQuery's ajaxSetup - I would like to add default data for GET requests only