2015-03-14 5 views
0

По какой-то нечетной причине Backbone пытается поместить объект модели, а не размещать его на сервере.Backbone пытается поставить вместо сообщения

ошибка является HTTP 500 ошибка, так Магистральная пытается поставить модель без идентификатора (потому что я сделал это не определено):

PUT /api/teams/undefined 500 285ms - 135b 

Вот мой код:

this.model.id = undefined; 
this.model._id = undefined; 
teamCollection.add(this.model); 
this.model.save(null, 
    { 
     success: function (model) { 

      $('.top-right').notify({ 
       message: {text: ' New team added! '}, 
       type: 'info', 
       fadeOut: { 
        delay: 3500 
       } 
      }).show(); 
      window.userHomeMainTableView.render(); 
     } 
     , 
     error: function (model) { 
      teamCollection.remove(model); 
      $('.top-right').notify({ 
       message: {text: ' Error adding team :( '}, 
       type: 'danger', 
       fadeOut: { 
        delay: 3500 
       } 
      }).show(); 
     } 
    }); 

даже после «форсирования» model.id и model._id не определены, Backbone все еще пытается выполнить HTTP PUT. Как это может быть?

ответ

1

Это странно, похоже, что он должен сделать POST из вашего кода. Похоже, вы можете его использовать. Из second answer здесь

fooModel.save(null, { 
    type: 'POST' 
}); 
+0

Да, спасибо, я видел это, но в целом я не хочу заставлять меня заставлять, есть веская причина, почему это происходит. –

3

Процесс синхронизации внутренне использует Model#isNew, чтобы решить, если он должен PUT или POST. isNew очень наивный:

isNewmodel.isNew()

[...] Если модель еще не имеет id, он считается новым.

и check is done using:

!this.has(this.idAttribute) 

has method только простой оберткой attr:

has: function(attr) { 
    return this.get(attr) != null; 
} 

поэтому они не имеют никакого отношения:

this.model.id = undefined; 
this.model._id = undefined; 

когда Backbo ne решает PUT или POST, те не действительно удаляют атрибут id, они разбивают вашу модель.

Я думаю, вы бы лучше скопировать модель (без id) и сохранения копии:

var data = m.toJSON(); 
delete data.id; 
var copy = new Model(data); 

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

Я думаю, вам нужно, чтобы unset атрибут id и вручную удалил свойство id, чтобы сделать то, что вы пытаетесь сделать.

+0

ну, я определил свой idAttribute в своей модели как _id, поэтому установка _id должна повлиять на него, правильно –

+1

Если у вас есть 'idAttribute: '_id'', тогда вы хотите' m.unset (' _ id ') 'и 'delete m.id'. Но все же, то, что вы пытаетесь сделать, выглядит немного странно для меня, похоже, вы пытаетесь повторно использовать существующий экземпляр модели, когда вы должны создавать новую. –

+0

nope, я отправляю новый объект модели в новый экземпляр представления, вот почему это так beffuddling –

-1

используйте следующий фрагмент кода, чтобы установить id в undefined.

this.model.set('id',undefined'); 

хотя, если это новая модель, вам не нужно это делать. по умолчанию он будет не определен. , если вы использовали идентификатор idAttribute для определения модели и сказали, что это значение userId, тогда вам нужно сделать что-то вроде этого.

this.model.set('userId',undefined'); 
Смежные вопросы