Базовая коллекция параметров URL-адреса API по умолчанию с использованием RequireJS - PullRequest
1 голос
/ 22 ноября 2011

Как мне установить 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).

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

Ответы [ 2 ]

5 голосов
/ 22 ноября 2011

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

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

чтобы использовать ваш пример: Предположим, ваш AJAX-вызов сохранен в виде 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 каким-то образом перехвачен или обработан, когда он будет запущен до того, как будут установлены ваши настройки, если ваш первоначальный вызов ajax не удался или занимает время, ваше приложение может быть уже запущено без установленных настроек, если использовать model.save() с этой точки зрения вам придется справиться с этим.

0 голосов
/ 20 октября 2013

Путем переопределения (но не перезаписи ) метода 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.

...