매개 변수를 사용하여 Backbone.js 페치


152

설명서에 따라 다음과 같이했습니다 .

var collection = new Backbone.Collection.extend({
        model: ItemModel,
        url: '/Items'
})

collection.fetch({ data: { page: 1} });

URL은 다음과 같이 밝혀졌습니다. http://localhost:1273/Items?[object%20Object]

나는 무언가를 기대하고 있었다 http://localhost:1273/Items?page=1

그렇다면 fetch 메소드에서 매개 변수를 어떻게 전달합니까?


확실히 이상합니다. API docs따라 정상적으로 작동하는 것 같습니다 . 최신 버전의 Backbone.js를 사용하고 있습니까?
매트 볼

당신은 시도 할 수 있습니까 JSON.stringify({ data: { page: 1} })?
Joe

@Joe Tuskan, 나는 그걸로 무엇을 해야할지 모르겠지만, 나는했다 : collection.fetch(JSON.stringify({ data: { page: 1} }));그리고 아무것도 URL에 전달되지 않았다 .
Shawn Mclean

좋아, 이렇게하십시오 : collection.fetch ({data : JSON.stringify ({페이지 : 1})});
Joe

3
이것은 당신이 Backbone 1.0 fyi에서 작성했을 때 잘 작동합니다
Dominic

답변:


213

바꾸다:

collection.fetch({ data: { page: 1} });

에:

collection.fetch({ data: $.param({ page: 1}) });

따라서 너무 많이하지 않으면 {data: {page:1}}객체를 다음과 같이 호출 합니다.options

Backbone.sync = function(method, model, options) {
    var type = methodMap[method];

    // Default JSON-request options.
    var params = _.extend({
      type:         type,
      dataType:     'json',
      processData:  false
    }, options);

    // Ensure that we have a URL.
    if (!params.url) {
      params.url = getUrl(model) || urlError();
    }

    // Ensure that we have the appropriate request data.
    if (!params.data && model && (method == 'create' || method == 'update')) {
      params.contentType = 'application/json';
      params.data = JSON.stringify(model.toJSON());
    }

    // For older servers, emulate JSON by encoding the request into an HTML-form.
    if (Backbone.emulateJSON) {
      params.contentType = 'application/x-www-form-urlencoded';
      params.processData = true;
      params.data        = params.data ? {model : params.data} : {};
    }

    // For older servers, emulate HTTP by mimicking the HTTP method with `_method`
    // And an `X-HTTP-Method-Override` header.
    if (Backbone.emulateHTTP) {
      if (type === 'PUT' || type === 'DELETE') {
        if (Backbone.emulateJSON) params.data._method = type;
        params.type = 'POST';
        params.beforeSend = function(xhr) {
          xhr.setRequestHeader('X-HTTP-Method-Override', type);
        };
      }
    }

    // Make the request.
    return $.ajax(params);
};

따라서 'data'를 jQuery.ajax로 보내면 params.dataURL에 무엇이든 추가하는 것이 가장 좋습니다 .


71

processData를 true로 설정할 수도 있습니다.

collection.fetch({ 
    data: { page: 1 },
    processData: true
});

Jquery는 데이터 객체를 매개 변수 문자열로 자동 처리합니다.

그러나 Backbone.sync 함수에서 Backbone은 POST, UPDATE에서 데이터를 처리하기 위해 다른 방법을 사용하기 때문에 processData를 끕니다.

백본 소스에서 :

if (params.type !== 'GET' && !Backbone.emulateJSON) {
    params.processData = false;
}


-2
try {
    // THIS for POST+JSON
    options.contentType = 'application/json';
    options.type = 'POST';
    options.data = JSON.stringify(options.data);

    // OR THIS for GET+URL-encoded
    //options.data = $.param(_.clone(options.data));

    console.log('.fetch options = ', options);
    collection.fetch(options);
} catch (excp) {
    alert(excp);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.