Я использую Backbone.js в своем приложении node. Я вызываю различные вызовы ajax из представлений, моделей и коллекций. Я создал свое пользовательское свойство, например. «myName» в каждом представлении, модели и коллекции, и каждому присваивается уникальное имя. Теперь мне нужно это свойство «myName» в ajax «beforeSend», поэтому я должен знать, из какого представления или модели вызывается этот ajax. Есть ли возможность сделать это?
Backbone.js - получить представление, модель или свойство коллекции в ajax 'beforeSend'
Ответы (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
}
});
Надеюсь это поможет!
beforeSend
не содержат такой информации. Фактический вызов $.ajax выполняется в Backbone.sync
, поэтому вы можете переписать его, чтобы передать коллекцию/модель в $.ajax как параметр по умолчанию. Но я думаю, это не очень хорошая идея
- person Vahan Vardanyan; 15.12.2014
Backbone.sync
. Вам как-то нужно сослаться на коллекцию/модель из beforeSend
, и лучший способ - options
.
- person Vahan Vardanyan; 15.12.2014
// for example
$.ajaxSetup({
beforeSend: function (xhr) {
xhr.setRequestHeader('viewName', yourGlobalVariable /* or session storage */);
}
});
перед каждым вызовом ajax (или выборкой модели/коллекции, сохранением и т. д.) сохраните yourGlobalVariable
имя вашего представления.
$.ajax
или все взаимодействие с сервером осуществляется с использованиемbackbone.model
иbackbone.collection
? - person Vahan Vardanyan   schedule 15.12.2014