Nano Hash - криптовалюты, майнинг, программирование

Рендеринг коллекции Backbone.js

Я Backbone.js n00b и пытаюсь понять это. Я знаю, как визуализировать модель с помощью представления и встроенного шаблонизатора underscore.js. Теперь я пытаюсь сделать коллекцию, и тут я застреваю. Здесь нет сервера, поэтому я ничего не получаю удаленно, просто простая HTML-страница с некоторым JavaScript.

ContinentModel = Backbone.Model.extend({});

ContinentsCollection = Backbone.Collection.extend({
  model: ContinentModel,

  initialize: function () {
    this.continentsView = new ContinentsView;
    this.bind("reset", this.continentsView.render);
  }
});

ContinentsView = Backbone.View.extend({
  el: '#continents',
  template: _.template($('#continents-template').html()),

  render: function() {
    var renderedContent = this.template(this.collection.toJSON());
    $(this.el).html(renderedContent);
    return this;
  }
});

$(function() {
  var continentsCollection = new ContinentsCollection();
  continentsCollection.reset([{name: "Asia"}, {name: "Africa"}]);
});

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

Спасибо за помощь...


Ответы:


1

Проблема в том, что когда вы определяете ContinentsView, шаблон оценивается и использует $('#continents-template'), но DOM еще не готов, поэтому шаблон не находит.

Чтобы решить эту проблему, просто переместите назначение шаблона в функцию инициализации:

ContinentsView = Backbone.View.extend({
  el: '#continents',
  initialize: function() {
     this.template = _.template($('#continents-template').html());
  }
  ...

Что касается коллекций, да, они группируют объекты, в частности наборы моделей.

Вы должны сделать код так, чтобы модели (и коллекции) НЕ знали о представлениях, только представления знали о моделях.

ContinentModel = Backbone.Model.extend({});

ContinentsCollection = Backbone.Collection.extend({
  model: ContinentModel,
  // no reference to any view here    
});

ContinentsView = Backbone.View.extend({
  el: '#continents',

  initialize: function() {
    this.template = _.template($('#continents-template').html());
    // in the view, listen for events on the model / collection
    this.collection.bind("reset", this.render, this);
  },

  render: function() {
    var renderedContent = this.template(this.collection.toJSON());
    $(this.el).html(renderedContent);
    return this;
  }
});

$(function() {
  var continentsCollection = new ContinentsCollection();
  continentsCollection.reset([{name: "Asia"}, {name: "Africa"}]);
  // initialize the view and pass the collection
  var continentsView = new ContinentsView({collection: continentsCollection});
});
31.10.2011
  • Спасибо Дира! Шаблон теперь работает, и совет, который модели не должны знать о представлениях, действительно помогает. Тем не менее, reset, похоже, не запускает функцию рендеринга представления. Любые идеи? 01.11.2011
  • Извините, понял, мне нужно переключить последние 2 строки в вашем примере, конечно. Мне нужно инициализировать континентыView до сброса коллекции. Спасибо! 01.11.2011
  • @dira +1 Большое спасибо за указание на то, что модели/коллекции не должны ссылаться на вид (по крайней мере, напрямую). Мои глаза на мгновение кровоточили. :) 01.11.2011

  • 2

    Также стоит отметить наличие дополнительных сложностей, которые быстро возникают при рендеринге коллекции в представлении. Например, представление обычно необходимо перерисовывать при добавлении или удалении моделей из коллекции. Реализовать собственное решение несложно, но, вероятно, стоит изучить существующие решения, поскольку существует довольно много опробованных и проверенных.

    Backbone.CollectionView — это надежный класс представления коллекции, который обрабатывает выбор моделей в ответ на щелчки мыши, переупорядочивание коллекция на основе перетаскивания, фильтрации видимых моделей и т. д.

    Несколько популярных фреймворков, построенных на базе backbone, также предоставляют простые классы представления коллекций, например Backbone.Marionette, Чаплин и Диспетчер компоновки.

    Несмотря на то, что сам Backbone не предоставляет какой-либо структуры для рендеринга коллекции, это нетривиальная проблема, и у многих людей разные мнения по поводу как это сделать. К счастью, это настолько распространенная потребность, что в экосистеме уже есть несколько хороших вариантов.

    20.05.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..