Переопределение Backbone Sync для использования разных вызовов для извлечения/сохранения/уничтожения

Причина, по которой я опаздываю на основную вечеринку, заключается в том, что я беспокоюсь, что она не будет хорошо работать с моим существующим веб-сервисом. Я даже дошел до того, что использую свою собственную версию магистральных контроллеров и моделей, но бесполезно просто писать свою собственную (конечно) худшую реализацию.

Я использую веб-службу Asp.net, поэтому, если мы обновляем пользовательскую модель, я использую следующие три вызова:

myservice/deleteUser.aspx?id=1
myService/getUser.aspx?id=1
myService/setUser.aspx? //post model

Я не понимаю, как это работает с магистралями sync ? Я предполагаю, что мне придется перезаписать fetch/save и destroy?

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


person Jon Wells    schedule 06.11.2012    source источник
comment
Я использую спокойный веб-сервис...deleteUser.aspx...getUser.aspx...setUser.aspx Не похоже.   -  person Roatin Marth    schedule 06.11.2012
comment
@RoatinMarth обновил вопрос   -  person Jon Wells    schedule 07.11.2012


Ответы (1)


Вы можете предоставить своим коллекциям или моделям пользовательскую функцию sync, которая будет вызываться вместо Backbone.sync при извлечении/обновлении/уничтожении элемента. Затем вы можете настроить параметры для отправки запроса, соответствующего настройке вашего сервера. Например,

var M = Backbone.Model.extend({

    sync: function(method, model, options) {
        options || (options = {});

       // passing options.url will override 
       // the default construction of the url in Backbone.sync

        switch (method) {
            case "read":
                options.url = "/myservice/getUser.aspx?id="+model.get("id");
                break;
            case "delete":
                options.url = "/myservice/deleteUser.aspx?id="+model.get("id");
                break;
            case "update":
                options.url = "/myService/setUser.aspx";
                break;
        }

        if (options.url)
            return Backbone.sync(method, model, options);
    }

});

var c = new M({id: 1});
c.fetch();
c.save();
c.destroy();

И скрипт, имитирующий эти вызовы http://jsfiddle.net/nikoshr/4ArmM/

Если вас беспокоит использование PUT и DELETE в качестве глаголов HTTP, вы можете принудительно выполнить POST, добавив Backbone.emulateHTTP = true; См. http://jsfiddle.net/nikoshr/4ArmM/1/ для исправленной версии.

person nikoshr    schedule 06.11.2012
comment
Хорошо, это большая помощь. скрипки полезны. Я попробую это сегодня вечером! Спасибо. - person Jon Wells; 06.11.2012
comment
Еще один вопрос, как переопределить сервисный домен? для всего приложения? Я предполагаю, что это тоже в Backbone.sync? - person Jon Wells; 07.11.2012
comment
@CrimsonChin Вы имеете в виду, что ваш сервис находится в другом домене, чем ваше приложение? Вам придется исследовать запросы CORS, и это тоже будет переопределено синхронизацией. - person nikoshr; 07.11.2012
comment
Это правильно. Сервис находится в другом домене. У меня работает CORS, но я не знаю, как сделать то же самое в backbone.js. Спасибо - person Jon Wells; 07.11.2012
comment
Как только вы запустите CORS, используйте полный URL-адрес: options.url = http://yourservice.yourapplication.com/myService/setUser... - person parliament; 29.03.2013
comment
Как сделать глобальную проверку? - person vini; 13.05.2015
comment
@vini, вы бы изменили прототипы Backbone.Model.sync или Backbone.Collection.sync или даже переопределили Backbone.sync, но это действительно зависит от того, чего вы хотите достичь - person nikoshr; 14.05.2015
comment
Я хочу иметь настраиваемый заголовок и настраиваемые URL-адреса для синхронизации с Backbone, а не проверять их для каждой модели. Мой вопрос: stackoverflow.com/questions/30230661/ - person vini; 14.05.2015