Генерация на лету URL-адресов для моделей Backbone.js

У меня есть несколько решений (скорее назовем их хаками) для этого, но я ищу элегантные решения проблемы. Вот проблема, пожалуйста, решайте ее медленно

Я получил WebMethods на странице index.aspx, на которую отправляются запросы ajax (create,update,delete). Один веб-метод не может обрабатывать все эти виды операций, поэтому для модели Person существует 3 метода, а именно:

  1. CreatePerson (attributes)
  2. UpdatePerson (attributes)
  3. DeletePerson(personId)

поэтому я использую хакерский процесс, как показано ниже, имена функций javascript соответствуют соответствующим методам на сервере.

CreatePerson:function(){

model.url = "/CreatePerson";

},
UpdatePerson:function(){

model.url = "/UpdatePerson";

},
DeletePerson:function(){

model.url = "/DeletePerson";

}

вышеуказанные методы объявлены в представлениях, отображающих модель Person. urlRoot для модели равен index.aspx, поэтому вызовы ajax будут направляться в метод CreatePerson внутри index.aspx при создании операции, то есть index.aspx/CreatePerson

Если я делегирую функцию синхронизации, она переопределит все модели в приложении js, чего я не хочу.

Вопрос

Могу ли я каким-то образом подготовить URL-адрес в соответствии с конечной точкой модели до того, как будет сделан запрос ajax при использовании Backbone.js со страницами asp.net?


person Deeptechtons    schedule 19.02.2012    source источник


Ответы (1)


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

var Model = Backbone.Model.extend({

    ...

    sync: function(method, model, options) {

      // here method param can be either "read", "create", "update", "destroy"
      // set your url based on its value

      Backbone.sync.call(this, method, this, options); 
      // if your super class had custom sync as well you'd have to call 
      // Model.__super__.sync.call(...)
    }

});

Я не программист ASP, но нельзя ли использовать интерфейс REST с .NET? сильно упрощает задачу :)

person Tom Tu    schedule 19.02.2012
comment
это не подходит, когда в приложении более одной модели (я могу ошибаться), для страницы Backbone.Sync - это синглтон, верно? или он существует для каждой модели - person Deeptechtons; 19.02.2012
comment
@Deeptechtons Здесь нет синглтона. Backbone просто проверяет, определяет ли ваша модель собственную функцию синхронизации, иначе вызывает Backbone.sync. - person ggozad; 19.02.2012
comment
@TomTu я упоминал, что ты был хорош, я упомяну это снова, ты действительно очень крут. :) +1 принято - person Deeptechtons; 19.02.2012