2015-09-22 1 views
1

Я пытаюсь настроить простой Marionette's CompositeView. Вот что я хочу, в конце концов:Marionette CompositeView в контексте выбора> опции

%select#target-id 
    %option{:value => "#{@id}"} = @name 
    %option{:value => "#{@id}"} = @name 
    etc 

В моей CompositeView я указать childViewContainer: select и мне нужно, чтобы отобразить как @name (для удобства чтения) и @Id (для соответствующего события) в опциях этого выберите , Из-за природы сНа по умолчанию элемента я могу к speficfy tagName как option в моем ItemView:

class New.TargetView extends App.Views.ItemView 
    template: "path/to/template" 
    tagName: 'option' 

И в шаблоне я могу передать только содержание чтобы быть созданы вариантом элемент: = @name. Это прекрасно работает, Marionette создает элемент выбора для каждой модели и заполняет его именем модели. Проблема в том, что я не знаю, как передавать атрибуты, так как я не могу указать атрибут еще не созданного элемента.

Я также попытался установить attributes собственность на ItemView как это:

attributes: 
    value: "#{@id}" 

И это технически работает: параметры заполняются с атрибутом value="", но содержание не определено. Пожалуйста посоветуй.

ответ

1

Я не уверен в части, когда вы используете attributes. Вы должны передать хеш или функцию, которая вернет хеш, как указано в Backbone view.attributes docs.

attributes: 
    value: "#{@id}" 

В старые деньги это работает именно так. Вот jsfiddle.

attributes: function() { 
    return { 
     value: this.model.id 
    }; 
} 
+0

Мне удалось обойти, заставив разворачивать элемент с помощью '@ $ el.unwrap()', но это намного более чище, и он становится все очевидным. Большое спасибо! –

0

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

Я предполагаю, что это не проблема с шаблоном, а с тем, как вы настраиваете данные. Насколько мне известно, нет опции attributes для ItemView, вам необходимо либо инициализировать CompositeView с правильно сформированной коллекцией, либо создать новые атрибуты с помощью метода serializeData на ItemView.

В первом случае, вы будете делать что-то вроде этого:

var SomeCompositeView = Marionette.CompositeView.extend({ 
    template: "your-template-name", 
    childViewContainer: select 
}); 

var SomeItemView = Marionette.ItemView.extend({ 
    template: "your-other-template", 
    tagName: 'option' 
}); 

// This collection can be retrieved from a database or anywhere else 
// Just make sure that the models have the fields you want 
var myCollection = new Backbone.Collection([{id: "someid1", name: "name1"}, {id: "someid2", name: "name2"}]); 

var view = new SomeCompositeView({collection: myCollection}); 

На втором случае вы будете иметь что-то подобное, но на ItemView вы будете иметь:

var SomeItemView = Marionette.ItemView.extend({ 
    template: "your-other-template", 
    tagName: 'option', 
    serializeData: function() { 
     return { someAttribute: "someValue" } 
    } 
} 

Просто помните, что для этого второго подхода ItemView должен иметь доступ к возвращаемым значениям. serializeData предназначен только для переформатирования данных или выполнения операций над данными, которые вы не можете выполнить в шаблоне. Шаблон будет иметь доступ только к переменным, возвращаемым с serializeData, независимо от оригинальной модели.

+0

Благодарим за ответ. Там нет проблемы как таковой, все работает так, как должно быть.Я могу написать '% option {: value =>" # {@ id} "} = @ name' в шаблоне' ItemView', и оба @id и @name будут проанализированы и отображены правильно. Однако в этом случае каждая опция '% {: value =>" # {@ id} "} = @ name' будет завернута в' div', созданный Marionette, что испортит HTML-структуру 'slecect> options'. Поэтому мне нужно найти способ передать оба атрибута контента _and_ внутри элемента _single_. –

+0

Это звучит очень странно. Не могли бы вы добавить остальную часть своего кода (где вы создаете коллекцию, как вы передаете ее в представление и т. Д.)? Кроме того, в вашем первоначальном вопросе вы ничего не упомянули об обертывании 'div', но это также звучит так, как будто что-то не так с вашим кодом, потому что если вы предоставляете' tagName' для обоих представлений, он не должен создавать 'div' – JayC