Базовая коллекция параметров URL-адреса API по умолчанию с использованием RequireJS

1

Как установить URL-адрес по умолчанию для всех моих запросов из коллекций и моделей в Backbone?

Пример коллекции:

define([
    'backbone',
    '../models/communityModel'
], function(Backbone, CommunityModel){
    return Backbone.Collection.extend({
        url: '/communities', // localhost/communities should be api.local/communities
        model: CommunityModel,
        initialize: function () {
            // something
        }
    });
});

Я делаю начальный вызов AJAX, чтобы получить мои настройки, включая URL-адрес API (api.local).

Как я могу перенаправить запросы без передачи его ко всем моим моделям или жестко кодировать URL-адрес в моделях и коллекциях?

Теги:
model-view-controller
requirejs
backbone.js

2 ответа

5
Лучший ответ

ваш url принимает строку или функцию.

с вашими настройками ajax-вызова вы можете сохранить его в нужном месте, и перейдите к нему из функции

чтобы использовать ваш пример: предположим, что ваш вызов ajax, сохранил URL-адрес в myApp.Settings.DefaultURL

define([
    'backbone',
    '../models/communityModel'
], function(Backbone, CommunityModel){
    return Backbone.Collection.extend({
        url: function(){
            return myApp.Settings.DefaultURL + '/communities';
        }, 
        model: CommunityModel,
        initialize: function () {
            // something
        }
    });
});

замечание убедитесь, что этот URL-адрес каким-то образом пойман или обработан, когда он будет запущен до того, как ваши настройки будут установлены, если ваш первоначальный аякс-вызов завершится неудачей или займет свое время, ваше приложение может быть запущено без его установки, если вы используете model.save() в этот момент вам нужно будет справиться с этим.

  • 0
    Спасибо за ваш ответ. Я пытаюсь избежать глобального объекта myApp (я использую RequireJS в качестве загрузчика модулей), поэтому я не могу получить к нему доступ в своей коллекции. Может плохое дизайнерское решение? Я думал о чем-то похожем на jQuery.ajaxSetup () для Backbone.
  • 0
    requireJS не ограничивает вас здесь, вам просто нужно структурировать ваш код по-другому, идея выше заключается в том, что, как только модель будет сохранена, она будет запрашивать URL-адрес где-то через эту функцию, это может быть глобальное myApp, это может быть модуль конфигурации вы определяете сами.
Показать ещё 2 комментария
0

Перегружая (но не переписывая) метод Backbone.sync, вы можете добиться того же результата, не добавляя один и тот же код к каждой отдельной модели/коллекции.

define(['underscore', 'backbone', 'myApp'], function (_, Backbone, myApp) {
    'use strict';

    // Store the original version of Backbone.sync
    var backboneSync = Backbone.sync;

    // Create a new version of Backbone.sync which calls the stored version after a few changes
    Backbone.sync = function (method, model, options) {
        /*
         * Change the `url` property of options to begin with the URL from settings
         * This works because the options object gets sent as the jQuery ajax options, which
         * includes the `url` property
         */
        options.url = myApp.Settings.DefaultURL + _.isFunction(model.url) ? model.url() : model.url;

        // Call the stored original Backbone.sync method with the new url property
        backboneSync(method, model, options);
    };
});

Затем в вашей модели/коллекции вы можете просто объявить url как обычно (например, url: '/events)

Не забудьте потребовать файл с новым кодом Backbone.sync где-нибудь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню