Backbone.js извлекает из него метод инициализации
кто-то создал приложение для нас, предоставил мне код, чтобы я мог пройти через него,
и я заметил это, что сначала кажется ОК, и даже приятно позволить коллекции управлять своими данными
но через некоторое время я начал думать о возможных подводных камнях в этой идее
так:
полезно ли извлекать данные коллекции из собственного метода инициализации.
например:
var Book = Backbone.Model.extend({});
var Books = Backbone.Collection.extend({
url: '/books',
initialize: function(){
// do some logic here
// if collection is empty, fetch from server
if(this.size() == 0)
this.fetch();
}
});
Я спрашиваю об этом, потому что чувствую, что это может быть проблемой в следующей ситуации:
предположим, что мы находимся в маршруте:
books: function() {
var books = new Books();
var bookList = new BookList({ collection: books });
}
не является ли эта ситуация возможной неудачей, если выборка будет быстрее, чем инициализация представления, где представление привязалось бы к событию reset, reset вызвало бы путь до инициализации вид выполнен?
Я ошибаюсь в этом, или я должен отправить билет, чтобы зафиксировать это.
Ответы
Ответ 1
Хотя на практике инициализация представления, скорее всего, произойдет до завершения fetch()
(и вы привяжете render()
к reset
not initialize()
), это действительно плохая идея полагаться на порядок async операций в любом случае. Другими словами, ваш код должен быть написан таким образом, чтобы сделать порядок несущественным.
Я видел, что fetch()
вызывается в initialize()
в разных проектах. Я все еще считаю это нежелательной и плохой практикой. Явная выборка, когда вам нужно также иметь следующие преимущества:
- Вы можете сделать это, когда вам нужно, а не каждый раз, когда вы создаете новую коллекцию.
-
Вы можете делать определенные вещи, если хотите:
Например, вы можете инициализировать свое представление и визуализировать только после того, как вы его получили.
var bookList, books = new Books();
var p = books.fetch();
p.done(function () {
bookList = new BookList({collection: books });
bookList.render();
});
-
Это упрощает тестирование.