Backbone.js с настраиваемым URL-адресом извлечения

Я пытаюсь настроить метод выборки на моей базовой модели, который будет отображать текущую модель для данного пользователя. Это доступно в API на /api/mealplans/owner/{username}/current.

Я написал следующую модель. Я прокомментировал URL-адрес Root, так как вызов fetch prototype был просто с помощью urlRoot, и я хотел посмотреть, было ли это переопределение параметра url, который я каким-то образом передал.

var mealPlan = Backbone.Model.extend({
  name: 'Meal Plan',
  //urlRoot: '/api/mealplans',
  defaults: {},
  fetchCurrent: function (username, attributes, options) {
    attributes = attributes || {};
    options = options || {};
    if (options.url === undefined) {
      options.url = "/api/mealplans/owner/" + username + "/current";
    }
    return Backbone.Model.prototype.fetch.call(this, attributes, options);
  },
  validate: function (attributes) {
    // To be done
    return null;
  }
});

Я видел это, в некоторых вариантах в других местах, например, в backbone.js используют разные URL-адреса для сохранения и выбора модели - в этом случае код немного отличается (я начал с этого и сломал его, чтобы облегчить мне чтение.)

Объект options имеет параметр url в нем отлично, когда я передаю его для извлечения, но тогда он, кажется, игнорирует его!

Ответ 1

Я принимал одни и те же параметры для извлечения, как и для сохранения. Это не так.

В сигнатуре метода для выборки используется только "параметры", а не "атрибуты", поэтому параметр url не найден.

Код модели должен выглядеть примерно так.

   var mealPlan = Ministry.Model.extend({

        name: 'Meal Plan',
        urlRoot: '/api/mealplans',

        defaults: {
        },

        fetchCurrent: function (username, options) {
            options = options || {};
            if (options.url === undefined) {
                options.url = this.urlRoot + "/owner/" + username + "/current";
            }

            return Backbone.Model.prototype.fetch.call(this, options);
        },

        validate: function (attributes) {
            // To be done
            return null;
        }
    });

Ответ 2

Я думаю, что лучше переопределить метод url(), как показано ниже:

 var mealPlan = Ministry.Model.extend({

    name: 'Meal Plan',
    urlRoot: '/api/mealplans',

    //--> this gets called each time fetch() builds its url
    url: function () { 
        //call the parent url()
        var url=Backbone.Model.prototype.url.call(this);
        //here you can transform the url the way you need
        url += "?code=xxxx";
        return url;
    }
 ...

Кроме того, в вашем примере выше я думаю, что есть ошибка, и вы должны заменить fetchCurrent на fetch