Как получить объект с Parse.com после его сохранения

Я создаю приложение для Phonegap, используя инфраструктуру Backbone и Parse.com в качестве серверной службы. Я создаю объект с Parse.com (соответствует моделям Backbone). Этот объект имеет метод saveDraftToP(), который вызывает функцию save() Parse.com. После того, как этот метод вызывается из представления, я хотел бы получить обновленный объект. Для этого я привязываю событие "change" к модели, но идентификатор, назначенный Parse, не определен. Вот код модели:

  var Match = Parse.Object.extend("Match", {
  states: {'DRAFT': 0, 'RUNNING': 1, 'ENDED': 2},
  saveDraftToP: function () {
    var self = this;
    this.save({
      user: Parse.User.current(),
      ACL: new Parse.ACL(Parse.User.current()),
      state: self.states.DRAFT
    }, {
      success: function (result) {
        self = result;
      },
      error: function (e) {

      }
    });
  }
});`

А вот код представления:

       var vmNuovaPartita = Parse.View.extend({
            template: Handlebars.compile(template),
            model: new Match(),
            collection: new HintCollection(),
            initialize: function () {
                this.bind("change:model", console.log(this.model.id) , this);
            },

            render: function (eventName) {
                var match = this.model.toJSON();
                $(this.el).html(this.template(match));
                return this;
            }
        });

person fcicer    schedule 12.05.2013    source источник


Ответы (1)


Я не совсем понимаю, почему у вас есть функция сохранения, обернутая в другую функцию, подобную сохранению. :-)

Скажем, у вас есть что-то вроде myMatch, которое является объектом.

Через ваш пользовательский интерфейс нажатие кнопки сохраняет данные объекта. Вы можете просто использовать myMatch.save({attr:val, ...}) прямо из коробки. Backbone (и Parse) по умолчанию настроены оптимистично. Это означает, что вы будете устанавливать значения модели, ожидая, что сохранение на сервере будет успешным.

Таким образом, вам не нужно извлекать ничего лишнего. У вас уже есть модель в ее самом текущем состоянии.

Чтобы представление модели реагировало на эти изменения, я бы разработал представление немного по-другому.

var vmNuovaPartita = Parse.View.extend({
        template: Handlebars.compile(template),
        initialize: function () {
            this.model.on('change', this.render);
        },
        render: function (eventName) {
            var match = this.model.toJSON();
            $(this.el).html(this.template(match));
            return this;
        }
    });

var myView = new vmNuovaPartita({
    model: myModel
});

Я бы инициализировал модель вне представления, а затем передал бы ее в качестве опции при создании нового представления. Когда вы передаете модель в качестве опции, она особенная и будет прикреплена непосредственно к представлению... view.model, на которую вы можете ссылаться внутри своего кода представления как this.model.

В инициализации мы размещаем прослушиватель модели для событий изменения, а затем запускаем повторную визуализацию представления. Или более хороший способ сделать это — добавить более новые события Backbone с помощью метода .listenTo().

person jmk2142    schedule 27.06.2013