Имею базовую системообразующую коллекцию моделей.

Вид, в котором я работаю, отображает информацию о модели, позволяя редактировать.

На рендере моего представления я захватываю модель на основе переданного идентификатора.

render: function() {

     this.model = myCollection.get(this.options.passedInId);

     // do the render...
}

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

    updateModel: function() {
        var me = this;

        this.model.set('someFlag', true);

        this.model.save(this.model.toJSON(), {
              success: function(model, resp) {
                 me.render();
              }


    }

Моя проблема в том, что когда он возвращается через рендеринг во второй раз, когда get из коллекции возвращает другой экземпляр модели (я вижу на нем другой cId), который не содержит моего измененного свойства someFlag. Поэтому мои правки не отображаются при повторной визуализации представления. Я знаю, что может быть более эффективный способ справиться с этим, но мой вопрос: почему это происходит? Разве модель, полученная из коллекции, не должна включать в себя изменения, которые я внес в эту модель?

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

2
Collin Estes 14 Мар 2013 в 20:12
Было бы лучше сохранить ссылку на саму модель в View.initialize(function(args) { this.model = args.model; });, чтобы просто вызвать this.model.save(), а затем this.render(), не дожидаясь успешного обратного вызова?
 – 
prototype
14 Мар 2013 в 20:16
Возможно, это сработает, но я действительно пытаюсь понять, почему это изменение не отражено в коллекции. Мне кажется, что я чего-то не понимаю в том, как коллекции / модели взаимодействуют в основе.
 – 
Collin Estes
14 Мар 2013 в 21:19
2
Если произошел сброс коллекции, то ожидается, что cid моделей будут другими. Находится ли состояние модели в обратном вызове успеха, как вы ожидаете? Вы уверены, что это тот же экземпляр коллекции?
 – 
Paul Hoenecke
14 Мар 2013 в 21:49
Да, он возвращается, как и ожидалось, и, насколько я могу судить, это тот же экземпляр
 – 
Collin Estes
19 Мар 2013 в 01:06

1 ответ

Лучший ответ

Моя проблема заключалась в том, что коллекция сбрасывалась между методом рендеринга и методом updateModel.

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

var me = this;  
this.collection.on('reset', function () {
     me.model = this.get(me.model.id);
};
1
Collin Estes 22 Мар 2013 в 20:26