2012-03-07 3 views
14

Кто-то, создав приложение для нас, предоставил мне код, чтобы я мог пройти через него, , и я заметил это, что сначала кажется ОК, и даже приятно позволить коллекции управлять его данные , но через некоторое время я начал думать о возможных подводных камнях в этой идее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(); 
    } 

}); 

я спрашиваю, потому что я чувствую, что это может быть проблемой в следующей ситуации:

предположим, что мы находимся в routeAction:

books: function() { 
    var books = new Books(); 
    var bookList = new BookList({ collection: books }); 
} 

ISN» Эта ситуация может привести к сбою, если выборка будет быстрее, чем инициализация представления, когда представление будет связано с событием сброса, сброс будет инициирован раньше была выполнена инициализация представления?

Я ошибаюсь, или я должен отправить билет, чтобы получить это исправление.

ответ

21

Хотя на практике инициализация зрения, скорее всего, произойдет до fetch() завершения (и вы бы связать render() с reset не initialize()) это очень плохая идея, чтобы полагаться на порядок асинхронными операций в любом случае. Другими словами, ваш код должен быть написан таким образом, чтобы сделать заказ неуместным.

Я видел fetch() в initialize() в различных проектах. Я все еще думаю, что это нежелательная и плохая практика. Явное получение, когда вам нужно также иметь следующие преимущества:

  1. Вы можете сделать это, когда вам нужно, а не каждый раз, когда вы создаете новую коллекцию.
  2. Вы можете сделать некоторые вещи в порядке, если вы хотите:

    Например, вы можете инициализировать вид и сделать только один раз у вас есть уши.

    var bookList, books = new Books(); 
    var p = books.fetch(); 
    p.done(function() { 
        bookList = new BookList({collection: books }); 
        bookList.render(); 
    }); 
    
  3. Это облегчает тестирование.

+0

спасибо за понимание, я попрошу его отредактировать код соответствующим образом. вы правы в нескольких моментах, хотя я верю в его случай, что текущее приложение создает только 1 коллекцию, поэтому загрузка каждый раз, когда создается коллекция, на самом деле не проблема, хотя я вижу, что это становится проблемой, когда приложение идет в версии 2 или 3 в следующем году могут быть добавлены другие коллекции. – Sander

+0

Как вы подразумеваете в своем вопросе, это вопрос правильного подхода. Извлечение внутри 'initialize' не приведет к ошибке. Это просто неэффективно, уродливо и * в принципе неправильно. – ggozad

+0

@ mu-is-too-short Спасибо! Я потратил 20 минут, пытаясь вычислить блоки кода внутри списков и потерпел неудачу. Я пропустил свой рест ... – ggozad

Смежные вопросы