내 노드 앱에서 Backbone.js를 사용하고 있습니다. 뷰, 모델 및 콜렉션에서 다양한 아약스 호출을 호출합니다. 예 : 내 맞춤 속성을 만들었습니다. 모든보기, 모델 및 컬렉션의 "myName"은 각각 고유 한 이름으로 지정됩니다. 이제이 "myName"속성을 ajax "beforeSend"에 넣으려고합니다. 그래서이 아약스가 호출 된 뷰 또는 모델을 알아야합니다. 이 작업을 수행 할 수있는 옵션이 있습니까? 보기의 yourGlobalVariable
이름Backbone.js - ajax에서 'beforeSend'의보기, 모델 또는 컬렉션 속성 가져 오기
답변
// for example
$.ajaxSetup({
beforeSend: function (xhr) {
xhr.setRequestHeader('viewName', yourGlobalVariable /* or session storage */);
}
});
각 아약스 호출하기 전에 (모델/컬렉션을 가져 오는 등 저장) 저장. 모든 수신 settings
당신이 두번째 인수를 볼 수있는 기능 (jqXHR jqXHR, PlainObject 설정)
:
beforeSend
유형 :
는
beforeSend
$.ajax()의 콜백이 개 인수를 수신 fetch
'Backbone.Collection'방법 또는 Backbone.Model
에 전달 된 옵션 :
예 :
귀하의 아약스 설정 : yourCustomCollectionOrModel
이 가져온 때마다
yourCustomCollectionOrModel.fetch({testVar: "Hello"}).done(function(){
// bla bla
})
그래서 testVar
이 전달됩니다 : 당신이 가져 오는 일을() 또는 어떻게 든 서버와 상호 작용
$.ajaxSetup({
beforeSend: function (xhr, options) {
console.log(options.testVar); // Will be "Hello" when collection fetched
}
});
장소 beforeSend
의 options
인수로
참고 : 더 선호되는 방법으로 문제를 해결할 수 있으면 전역을 피하십시오.
당신이 수집 또는 모델을 가져 오는 언제든지 동일한를 반복하지 않으려면 이벤트 더 갈 수 있습니다.
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);
}
});
업데이트 :이에서
var oldSync = Backbone.sync;
Backbone.sync = function(method, model, options) {
options = options || {};
options.modelContext = model;
return oldSync.call(Backbone, method, model, options);
}
:
또 다른와 동일한 동작을 달성하기 위해 어쩌면 가장 짧은 방법은,이 같은 Backbone.sync
을 래핑하는 것입니다 fetch를 다시 작성하거나 수동으로 옵션을 0123에 전달할 필요가 없습니다.방법.
그리고 beforeSend 콜백에서 $.아약스 :
$.ajaxSetup({
beforeSend: function (xhr, options) {
console.log(options.modelContext); // this will be the model's or collection's instance
}
});
희망이 있습니다.
감사합니다. @ vahan-vardanyan, 내가 언급 한 것보다 다소간 똑같은 일을하고 있습니다. 귀하의 예제에 따라, 나는 "beforeSend"의 설정에서 수신되는 fetch에서 옵션을 설정해야합니다. 하지만 여기서는 "yourCustomCollectionOrModel"또는 atelast yourCustomCollectionOrModel.myName 속성을 옵션으로 전달하지 않고 싶습니다. 어떤 방법이 있습니까? –
컬렉션 또는 모델의 범위에 어떻게 든 액세스해야하므로 참조가 필요합니다. 'beforeSend'의 주장은 그런 종류의 정보를 가지고 있지 않습니다. 실제 $ .ajax 호출은'Backbone.sync'에서 수행되었으므로 콜렉션/모델을 디폴트로 $ .ajax 옵션으로 전달하도록 다시 작성할 수 있습니다. 그러나 나는 좋은 생각이 아니란 것 같아. –
감사합니다. @ vahan-vardanyan 님, yr 응답으로 죄송 합니다만, 제 침대의 영어로 인해 당신이 설명하는 것을 이해할 수 없었습니다. 같은 것을 보여 주실 수 있습니까? –
'backbone.model'과'backbone.collection'을 사용하여 커스텀'$ .ajax' 호출이나 서버와의 모든 상호 작용이 있습니까? –
@VahanVardanyan, $ .ajaxSetup()을 작성하고 "beforeSend"에서 모든 Ajax 호출을 삭제합니다. 이 메서드에서는 어떤 모델 또는 컬렉션에서이 아약스를 호출할까요? –
답변을 추가했습니다. –