как установить метод обратного вызова для извлечения из магистрали

Как вы устанавливаете имя функции jsonpCallback для метода выборки backbonejs? Чтобы добавить к проблеме, я также использую requireJS, поэтому я стараюсь не иметь глобальной функции и следовать шаблону AMD.

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

Пример кода

define([
    'jquery',
    'underscore',
    'backbone',
    'marionette',
    'paginator',
    'models/item'], function($, _, Backbone, Marionette, Paginator, modelItem) {
    'use strict';

        var PaginatedCollection = Paginator.requestPager.extend({ 
            model: modelItem,

            paginator_core: {
               jsonpCallback : 'callbackFunc',

                type: 'GET',
                cache: true,

                dataType: 'jsonp',

            },      
            callbackFunc : function(data) {
                console.log(data);
            }

        });

        return PaginatedCollection;

    });

Сообщение об ошибке

TypeError: callbackFunc не является функцией


person mad dev    schedule 10.04.2013    source источник
comment
Можете ли вы показать нам свой код? Является ли поддержка Jsonp частью Backbone или другой библиотеки, которую вы используете?   -  person Matt Zeunert    schedule 11.04.2013
comment
WhatHaveYouTried.com?   -  person Zachary Kniebel    schedule 11.04.2013
comment
Добавлен образец кода. Просто показываю ту часть, с которой у меня проблемы.   -  person mad dev    schedule 11.04.2013
comment
Должен ли callbackFunc быть глобальным?   -  person Paul Grime    schedule 11.04.2013
comment
как мне сделать это с requireJs, так как все является модулем, а не глобальным   -  person mad dev    schedule 11.04.2013
comment
Если он должен быть глобальным, то window.callbackFunc=..., иначе, если ошибка связана с тем, что jsonpCallback передается как строка, а не как функция, попробуйте jsonpCallback : function(data) { console.log(data); }.   -  person Paul Grime    schedule 11.04.2013
comment
Передача @PaulGrime jsonpCallback в качестве функции приведет к тому, что jquery создаст случайное имя функции в ?callback. передача его как строки находится в документах jquery.   -  person mad dev    schedule 11.04.2013


Ответы (2)


Переопределите выборку, чтобы передать имя метода обратного вызова в запросе.

fetch: function(options) {
  options || (options = {});
  var data = (options.data || {});
  options.dataType = 'jsonp';
  options.jsonp = 'callbackFunc';

  return Backbone.Collection.prototype.fetch.call(this, options);
}
person Scott Puleo    schedule 11.04.2013

Поскольку вы хотите кэшировать результаты (в браузере, а может быть и на сервере), вам также необходимо установить параметр options.cache.

Также параметр jsonpCallback не jsonp

Вот как должна выглядеть ваша функция блокировки синхронизации:

sync: function (method, model, options) {
    options.timeout = 10000; // required, or the application won't pick up on 404 responses
    options.dataType = 'jsonp';
    options.jsonpCallback = 'callbackFunc';
    options.cache = 'true';
    return Backbone.sync(method, model, options);
}

NB: BackboneJS v1.0, не тестировался в 0.9 или более ранних версиях.

person kcathode    schedule 09.07.2013