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();
    });
    
  • Это упрощает тестирование.