Проблемы с использованием нескольких моделей в одном представлении Backbone и шаблоне EJS

Я пытаюсь использовать две модели в одном представлении и, следовательно, в шаблоне, но после попытки использовать примеры, показанные в этом вопросе: Backbone.js: сложные представления, объединяющие несколько моделей Я сталкиваюсь с некоторыми ошибками.

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

var model = new Backbone.Model();
model.set({ image: image, person: person });
var view = new Project.Views.Images.ShowView({ model: model });

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

<img width="<%= image.width %>" height="<%= image.height %>" alt="<%= image.message %>" src="<%= image.url %>" />
<p><%= image.message %></p>
<h4>by <%= person.name %></h4>

Вот что выдает этот шаблон:

<img width="" height="" alt="" src="function () {
  var base = getUrl(this.collection) || this.urlRoot || urlError();
  if (this.isNew()) return base;
  return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + encodeURIComponent(this.id);
}">
<p></p>
<h4>by </h4>

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

Я также пробовал другой подход:

var view = new Project.Views.Images.ShowView({ model: image, person: person });

Тогда шаблон выглядит так:

<img width="<%= width %>" height="<%= height %>" alt="<%= message %>" src="<%= url %>" />
<p><%= message %></p>
<h4>by <%= person.name %></h4>

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

Что я делаю неправильно и правильны ли эти подходы?


person sethdeckard    schedule 03.03.2012    source источник


Ответы (2)


В аргументе «модель» в представлениях нет ничего волшебного, кроме как в качестве своего рода соглашения, Backbone копирует его в свойство «модель» в вашем представлении.[1]

Вы можете передать столько вещей, сколько хотите, в представление — вам просто нужно что-то сделать с ними в функции initialize.

Я бы пошел с риффом на ваш второй выбор:

var view = new Project.Views.Images.ShowView({ image: image, person: person });

в функции инициализации вашего представления

initialize: function(options) {
    this.image = options.image;
    this.person = options.person;
}

Я не знаком с использованием шаблонов EJS с Backbone, но обычно, если вам нужно свойство модели, вам нужно .get() как model.get('propertyName')

Итак, в приведенном выше случае вы бы вместо этого сделали image.get('someImageProperty') и person.get('somePersonProperty')

По вашему мнению, не будет свойства «модель», так как вы не передали ни одного аргумента с именем «модель».

Если вы хотите использовать свой первый выбор, вам нужно обратиться к «подобъектам» через model.get('image').get('someImageProperty')

[1] Что Backbone по умолчанию делает с «моделью», так это:

initialize: function(options) {
    this.model = options.model;
}

Он делает это по умолчанию для любых опций с такими именами:

'model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName'

person Edward M Smith    schedule 03.03.2012
comment
Ни один из вышеперечисленных методов не работает, и если бы вы ссылались на базовую модель вместо представления JSON в EJS (не уверен, что это возможно), это было бы немного запутанно, поскольку вам нужно было бы избегать этих круглых скобок. - person sethdeckard; 04.03.2012

EJS был неправильным, при объединении моделей в одну модель представления мне пришлось использовать следующий шаблон (обратите внимание на объект «атрибуты»):

<img width="<%= image.attributes.width %>" height="<%= image.attributes.height %>" alt="<%= image.attributes.message %>" src="<%= image.attributes.url %>" />
<p><%= image.attributes.message %></p>
<h4>by <%= person.attributes.name %></h4>

Я не изучал это глубже, поэтому я не уверен, почему сериализация JSON отличается от одной модели, но это так. Когда я просто передаю изображение в качестве модели, я могу опустить объект атрибутов следующим образом:

<%= width %>
person sethdeckard    schedule 04.03.2012
comment
Вы также можете передать модель, преобразованную в json, вызвав метод объекта модели toJSON(). Это сделано для того, чтобы вам не пришлось получать атрибуты модели из объекта атрибутов при использовании модели внутри шаблона. бывший. мой шаблон (this.model.toJSON()); - person jpanganiban; 06.05.2012