Backbone JS Сохранить / Удалить на сервере Сохранить основные ключи, связанные с моделями? - PullRequest
2 голосов
/ 30 апреля 2011

Хорошо, допустим, у меня есть база данных с таблицей Person.У него есть следующие поля:

Id (PK, auto-increment) Name (string) Age (int)

Я могу выбрать сервер для Списка людей, и когда я рендерим Магистральные Представления, у него будут связанные идентификаторы в модели.Отлично.

Теперь допустим, у меня есть функция Добавить, чтобы добавить нового человека.У меня может быть 2 текстовых поля (одно для имени, одно для возраста) и кнопка сохранения.

Когда я нажимаю «Сохранить», я могу использовать коллекцию людей из Backbone и добавить эту запись в коллекцию, а также обработать (POST для URL-адреса Backbone Collection) отправку (имя, возраст) на мой сервер.

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

Или это идея, которая после "добавления"«Мне нужно получить снова, чтобы получить новый список?

1 Ответ

3 голосов
/ 01 мая 2011

Мне может не хватить информации, чтобы ответить на этот вопрос на основании вашего вопроса, поэтому я предполагаю, что у вас есть представление, которому был предоставлен экземпляр коллекции. Кроме того, я предполагаю, что ваш POST публикует атрибуты модели, но сразу возвращает атрибуты модели, включая ее недавно назначенный идентификатор.

Итак, что вы хотите сделать, это:

  1. Привязать представление к событию DOM для всего, что инициирует сохранение человеком.
  2. Привязать представление к событиям добавления (и / или удаления) экземпляра коллекции.
  3. В вашем обработчике событий Person сохраните атрибуты Person и инициализируйте с ними новую модель Person; затем сохраните его. В обратном вызове успеха добавьте полученную модель, у которой теперь есть идентификатор, в коллекцию.
  4. В обработчике добавления событий повторно отредактируйте представление соответствующим образом.

Вот код:

PeopleView = Backbone.View.extend({

  events: {
      "submit form#person-form" : "onSave",
      "click .remove-person"    : "onRemovePerson",
  },

  // Presumes you've handed the view a people collection and
  // named it 'collection' to enable backbone.js to auto set it
  // into the view's state.
  initialize: function(options) {
      _.bindAll(this, "onPersonAdded");
      this.collection.bind("add", this.onPersonAdded);
      this.collection.bind("remove", this.onPersonRemoved);
  },

  onSave: function(e) {
      var self = this;
      var person = new Person();
      var person_attrs = this.serialize();  // harvest from your form in this method.
      person.save(person_attrs, {
          success: function(saved_person, data) {
              self.collection.add(saved_person);
          },
          error: function(aborted_person, response) {
              // Error handling as needed.
          }
      });
  },

  onRemovePerson: function(e) {
      e.preventDefault();
      var cid = $(e.target).attr('id');
      var person = this.collection.getByCid(cid);
      person.destroy({
          success: function(removed_person, data) {
              self.collection.remove(removed_person);
          },
          error: function(aborted_person, response) {
              // Error handling as needed.
          }
      });
  },

  onPersonAdded: function(added_person) {
      // perform rendering as needed here.
  },

  onPersonRemoved: function(removed_person) {
      // perform rendering as needed here.
  }

});

В качестве стилистического примечания вы можете не захотеть обрабатывать код сохранения модели в представлении. В качестве альтернативы вы можете обратиться к контроллеру или другому подходящему объекту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...