2016-06-02 1 views
1

Я вижу обратный вызов успеха, но в отладчике Chrome Dev Tools я все еще вижу модель при вводе this.model. Я знаю, что он уничтожен на стороне сервера, но можете ли вы объяснить, почему он все еще привязан к просмотру? Как я могу избавиться от него?Как избавиться от модели, прикрепленной к просмотру после использования модели Backbone # destroy?

 delete: function() { 
      this.model.destroy({success: function() {console.log("success in destroy");}}); 
      debugger; 
     } 
+2

Я думаю, что так оно и работает. Я посмотрел на источник Backbone, и он показывает, что 'destroy' отправляет на сервер запрос DELETE и отбрасывает модель из всех объектов, которые он прослушивает. Я ничего не вижу об исключении объекта модели. – 76484

ответ

2

То, что вы видите, является правильным. Глядя на the documentation on model.destroy (или хочет the code) мы можем видеть, что это в основном делает две вещи:

  • HTTP удаления представления сервера модель
  • Удаляет модель из любых содержащих коллекций

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

Мы можем увидеть это поведение с помощью простого примера:

var foo = new Backbone.Model({foo: 'bar'}); 
 
var foos = new Backbone.Collection([foo]); 
 
var fooView = new Backbone.View(); 
 
fooView.model = foo; 
 

 
foo.destroy({success: function() { 
 
    console.log('success'); 
 
}}); 
 

 
console.log(foo, foos, fooView);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone.js"></script>

Обратите внимание, что ничего не происходит foo или fooView.model после выполнения этого кода, хотя foos больше не содержит экземпляр foo.

Удаление view.model

Если вы хотите, чтобы удалить модель с точки зрения вы можете использовать обратный вызов успеха. Просто измените delete метод вашей точки зрения (от вашего вопроса) к чему-то вроде следующий:

delete: function() { 
    this.model.destroy({success: function() { 
     delete this.model; 
    }.bind(this)}); 
} 

В качестве альтернативы, так как мы знаем из документации, что модель будет стрелять из "destroy" события, мы также можем слушать для этого события и огня обратный вызов, который удаляет нашу модель.

+0

Я не вижу, что вид имеет метод удаления - это то, что вы только что создали и планируете присоединить в качестве обратного вызова к уничтожению модели? – akantoword

+1

Да. Я основывал это на методе 'delete' в вашем вопросе. – Lochlan