Backbone.js - получить представление, модель или свойство коллекции в ajax 'beforeSend'

Я использую Backbone.js в своем приложении node. Я вызываю различные вызовы ajax из представлений, моделей и коллекций. Я создал свое пользовательское свойство, например. «myName» в каждом представлении, модели и коллекции, и каждому присваивается уникальное имя. Теперь мне нужно это свойство «myName» в ajax «beforeSend», поэтому я должен знать, из какого представления или модели вызывается этот ajax. Есть ли возможность сделать это?


person Manish Sapkal    schedule 15.12.2014    source источник
comment
У вас есть пользовательские вызовы $.ajax или все взаимодействие с сервером осуществляется с использованием backbone.model и backbone.collection?   -  person Vahan Vardanyan    schedule 15.12.2014
comment
@VahanVardanyan, я сделал $.ajaxSetup() и удалил все вызовы ajax перед отправкой. В этом методе я хочу, из какой модели или коллекции вызывается этот ajax?   -  person Manish Sapkal    schedule 15.12.2014
comment
Я добавил ответ.   -  person Vahan Vardanyan    schedule 15.12.2014


Ответы (2)


beforeSend обратный вызов $.ajax() получает 2 аргумента:

перед отправкой

Тип: Функция (jqXHR jqXHR, настройки PlainObject)

Как видите, 2-й аргумент — settings, который получает все параметры, переданные методу fetch 'Backbone.Collection' или Backbone.Model:

Пример:

Ваша настройка 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, он будет передан аргументу options beforeSend.

Примечание. Избегайте глобальных переменных, если вы можете решить проблему более предпочтительным способом.


Вы можете пойти на мероприятие лучше, если не хотите повторять одно и то же каждый раз, когда выбираете коллекцию или модель.

Просто перепишите метод 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:

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

Надеюсь это поможет!

person Vahan Vardanyan    schedule 15.12.2014
comment
спасибо @vahan-vardanyan, я делаю более или менее то же самое, что вы упомянули. В соответствии с вашим примером я должен установить параметры в выборке, которые получены в настройках перед отправкой. но здесь мне нужно свойство yourCustomCollectionOrModel или, по крайней мере, yourCustomCollectionOrModel.myName, не передавая его в опции. Там в любом случае? - person Manish Sapkal; 15.12.2014
comment
Вам нужно каким-то образом получить доступ к области коллекции или модели, поэтому вам нужна ссылка на нее. Аргументы beforeSend не содержат такой информации. Фактический вызов $.ajax выполняется в Backbone.sync, поэтому вы можете переписать его, чтобы передать коллекцию/модель в $.ajax как параметр по умолчанию. Но я думаю, это не очень хорошая идея - person Vahan Vardanyan; 15.12.2014
comment
спасибо @vahan-vardanyan за ответ, но извините, я не мог понять, что вы объясняете, из-за моего английского языка. Можете ли вы привести какой-либо пример для того же? - person Manish Sapkal; 15.12.2014
comment
Посмотрите на определение Backbone.sync . Вам как-то нужно сослаться на коллекцию/модель из beforeSend, и лучший способ - options. - person Vahan Vardanyan; 15.12.2014
comment
@ManishSapkal Я добавил обновление к вопросу. Я предполагаю, что это лучший способ для вас. - person Vahan Vardanyan; 15.12.2014

// for example
$.ajaxSetup({
       beforeSend: function (xhr) {
           xhr.setRequestHeader('viewName', yourGlobalVariable /* or session storage */);
       }
});

перед каждым вызовом ajax (или выборкой модели/коллекции, сохранением и т. д.) сохраните yourGlobalVariable имя вашего представления.

person aleha    schedule 15.12.2014