Коллекция Backbone — обновление модели

Я получаю список моделей с сервера в коллекцию. Когда пользователя интересует конкретная модель, я перенаправляю его в средство просмотра этой модели на основе идентификатора.

Теперь предположим, что пользователю нужно отредактировать эту модель в представлении, например: он обновляет свое имя. Я задаю URL-адрес модели, обновляю имя и вызываю сохранение. Он вызывает серверную часть (в моем случае Джерси) и сохраняется. Однако коллекция по-прежнему не обновляется автоматически.

Почему коллекция не может привязываться к каждому изменению в модели и обновлять ее самостоятельно?

Как правильно сохранить модель, входящую в коллекцию? Правильно ли вызвать сохранение модели (указав ее URL-адрес), а затем удалить ее из родительской коллекции, а затем снова добавить ее с помощью молчания: true?

Спасибо.


person cloudpre    schedule 02.08.2012    source источник
comment
Вам не нужно устанавливать URL-адрес, модель получает свой URL-адрес из коллекции, к которой она принадлежит (при условии, что вы следуете рекомендуемому формату API). Что значит коллекция не обновляется автоматически? Пока вы используете объект модели, принадлежащий коллекции, события изменения будут срабатывать при сохранении модели.   -  person OlliM    schedule 02.08.2012


Ответы (1)


Коллекция не обновляется?

Когда вы говорите "коллекция не обновляется автоматически", я думаю, вы имеете в виду "представление не обновляется автоматически".

Представление не будет реагировать на изменения модели, по крайней мере, если вы явно скажете об этом, используя bindings:

// code simplified and no tested
var MyModel = Backbone.Model.extend({});

var MyModelView = 
  Backbone.View.extend({
    initialize: function(){
      this.model.on( "change:all", this.render, this );
    },
    render: function(){
      this.$el.html( "<h1>" + this.model.title + "</h1>" );
    }
  })

Объявите URL-адрес явно для каждой модели

Как сказал @OlliM, в этом нет необходимости, если ваш сервер поддерживает стандартный API CRUD. Вы можете объявить URL-адрес в своей коллекции следующим образом:

  • /app/collection

И Backbone будет использовать эти URL-адреса в качестве API:

  • (GET) /app/collection получить всю коллекцию
  • (GET) /app/collection/1 получить только модель с id = 1
  • (PUT) /app/collection/1 обновить модель с id = 1
  • (POST) /app/collection создать новую модель
  • ... УДАЛИТЬ и так далее
person fguillen    schedule 02.08.2012
comment
У меня есть привязка к событию изменения, но почему-то оно не обновлялось. Я должен буду проверить код. Спасибо. - person cloudpre; 02.08.2012
comment
Чтобы быть точным, используйте свойство urlRoot вместо url для модели, и магистраль будет автоматически использовать правильный метод HTTP и URL (как определено выше) при вызове функций save и fetch - person IsmailS; 11.06.2013