【问题标题】:Backbone.js - get view, model or collection property in ajax 'beforeSend'Backbone.js - 在 ajax 'beforeSend' 中获取视图、模型或集合属性
【发布时间】:2014-12-15 07:49:05
【问题描述】:

我在我的节点应用程序中使用 Backbone.js。我从视图、模型和集合中调用各种 ajax 调用。我已经创建了我的自定义属性,例如每个视图、模型和集合中的“myName”,并为每个视图分配唯一的名称。现在我想要ajax“beforeSend”中的这个“myName”属性,所以我应该知道从哪个视图或模型调用这个ajax。有什么办法可以做到吗?

【问题讨论】:

  • 您是否有自定义的$.ajax 调用或所有使用backbone.modelbackbone.collection 完成的与服务器的交互?
  • @VahanVardanyan,我已经制作了 $.ajaxSetup(),并在“beforeSend”中删除了所有 ajax 调用。在这个方法中,我想从哪个模型或集合中调用这个ajax?
  • 我已经添加了答案。

标签: node.js backbone.js backbone-views backbone.js-collections backbone-model


【解决方案1】:

$.ajax()beforeSend 回调接收 2 个参数:

发送前

类型:函数(jqXHR jqXHR,PlainObject 设置)

如您所见,第二个参数是settings,它接收传递给“Backbone.Collection”或Backbone.Modelfetch 方法的所有选项:

示例:

您的 ajax 设置:

$.ajaxSetup({
       beforeSend: function (xhr, options) {
           console.log(options.testVar); // Will be "Hello" when collection fetched
       }
});

当您执行 fetch() 或以某种方式与服务器交互时放置:

yourCustomCollectionOrModel.fetch({testVar: "Hello"}).done(function(){
    // bla bla        
})

所以每当yourCustomCollectionOrModel 获取testVar 时,都会传递给beforeSendoptions 参数。

注意:如果您能以更喜欢的方式解决问题,请避免使用全局变量。


如果您不想在获取集合或模型时重复相同的操作,您可以更好地进行事件。

只需重写 fetch() 方法,并将特定于集合/模型的标志添加到选项中。

示例

var TestCollection = Backbone.Collection.extend({
    url: 'your/api/path', 
    fetch: function (options) {
        options = options || {};
        options.testVar = 'Hello';
        return this.constructor.__super__.fetch.call(this, options);
    }
});  

更新:

实现相同行为的另一种可能是最短的方法是像这样包装Backbone.sync

  var oldSync = Backbone.sync;
  Backbone.sync = function(method, model, options) {
    options = options || {};
    options.modelContext = model;
    return oldSync.call(Backbone, method, model, options);
  }

这样你就不需要重写 fetch,或者手动将选项传递给fetch() 方法。

还有 $.ajax 的 beforeSend 回调:

$.ajaxSetup({
       beforeSend: function (xhr, options) {
           console.log(options.modelContext); // this will be the model's or collection's instance
       }
});

希望这会有所帮助!

【讨论】:

  • 感谢@vahan-vardanyan,我正在做的事情或多或少与您提到的相同。根据您的示例,我必须在 fetch 中设置选项,该选项在“beforeSend”的设置中接收。但在这里我想要“yourCustomCollectionOrModel”或至少 yourCustomCollectionOrModel.myName 属性而不将其传递给选项。有什么办法吗?
  • 您需要以某种方式访问​​集合或模型的范围,因此您需要对其进行一些引用。 beforeSend 的论点不包含此类信息。实际的 $.ajax 调用在 Backbone.sync 中完成,因此您可以重写它以将集合/模型作为默认选项传递给 $.ajax。但我想这不是一个好主意
  • 感谢@vahan-vardanyan 的回复,但很抱歉,由于我的床上英语,我无法理解您的解释。你能举个例子吗?
  • 查看definitionBackbone.sync 。你需要从beforeSend引用集合/模型,最好的方法是options
  • @ManishSapkal 我为问题添加了更新。我认为这是最适合您的方式。
【解决方案2】:
// for example
$.ajaxSetup({
       beforeSend: function (xhr) {
           xhr.setRequestHeader('viewName', yourGlobalVariable /* or session storage */);
       }
});

在每个 ajax 调用(或模型/集合获取、保存等)之前存储在您的视图的 yourGlobalVariable 名称中。

【讨论】:

    猜你喜欢
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多