1

내 노드 앱에서 Backbone.js를 사용하고 있습니다. 뷰, 모델 및 콜렉션에서 다양한 아약스 호출을 호출합니다. 예 : 내 맞춤 속성을 만들었습니다. 모든보기, 모델 및 컬렉션의 "myName"은 각각 고유 한 이름으로 지정됩니다. 이제이 "myName"속성을 ajax "beforeSend"에 넣으려고합니다. 그래서이 아약스가 호출 된 뷰 또는 모델을 알아야합니다. 이 작업을 수행 할 수있는 옵션이 있습니까? 보기의 yourGlobalVariable 이름Backbone.js - ajax에서 'beforeSend'의보기, 모델 또는 컬렉션 속성 가져 오기

+0

'backbone.model'과'backbone.collection'을 사용하여 커스텀'$ .ajax' 호출이나 서버와의 모든 상호 작용이 있습니까? –

+0

@VahanVardanyan, $ .ajaxSetup()을 작성하고 "beforeSend"에서 모든 Ajax 호출을 삭제합니다. 이 메서드에서는 어떤 모델 또는 컬렉션에서이 아약스를 호출할까요? –

+0

답변을 추가했습니다. –

답변

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

각 아약스 호출하기 전에 (모델/컬렉션을 가져 오는 등 저장) 저장. 모든 수신 settings 당신이 두번째 인수를 볼 수있는 기능 (jqXHR jqXHR, PlainObject 설정)

:

beforeSend

유형 :

1

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 
     } 
}); 

장소 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); 
    } 
}); 

업데이트 :이에서

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 
     } 
}); 

희망이 있습니다.

+0

감사합니다. @ vahan-vardanyan, 내가 언급 한 것보다 다소간 똑같은 일을하고 있습니다. 귀하의 예제에 따라, 나는 "beforeSend"의 설정에서 수신되는 fetch에서 옵션을 설정해야합니다. 하지만 여기서는 "yourCustomCollectionOrModel"또는 atelast yourCustomCollectionOrModel.myName 속성을 옵션으로 전달하지 않고 싶습니다. 어떤 방법이 있습니까? –

+0

컬렉션 또는 모델의 범위에 어떻게 든 액세스해야하므로 참조가 필요합니다. 'beforeSend'의 주장은 그런 종류의 정보를 가지고 있지 않습니다. 실제 $ .ajax 호출은'Backbone.sync'에서 수행되었으므로 콜렉션/모델을 디폴트로 $ .ajax 옵션으로 전달하도록 다시 작성할 수 있습니다. 그러나 나는 좋은 생각이 아니란 것 같아. –

+0

감사합니다. @ vahan-vardanyan 님, yr 응답으로 죄송 합니다만, 제 침대의 영어로 인해 당신이 설명하는 것을 이해할 수 없었습니다. 같은 것을 보여 주실 수 있습니까? –