Короткий зміст: динамічно встановлюються атрибути подання з даними моделі
http://jsfiddle.net/5wd0ma8b/
var View = Backbone.View.extend( {
attributes : function () {
return {
class : this.model.get( 'item_class' ),
id : this.model.get( 'item_id' )
};
}
} );
var item = new View( {
model : new Backbone.Model( {
item_class : "nice",
item_id : "id1"
} )
} );
Цей приклад передбачає, що ви дозволяєте Backbone генерувати для вас елемент DOM.
attributesМетод викликається після того, як властивості , що передаються вид конструктора встановлюються (в даному випадку model), що дозволяє динамічно встановлювати атрибути з модельними даними , перш ніж створює Backbone el.
На відміну від деяких інших відповідей: не жорстко кодує значення атрибутів у класі представлення, динамічно встановлює їх із даних моделі; не чекає, поки render()встановить attr vals; не встановлює неодноразово attr vals під час кожного дзвінка render(); не надмірно встановлює вручну значення attr для елемента DOM.
Зверніть увагу, що при встановленні класу під час виклику Backbone.View.extendабо конструкторі подання (наприклад new Backbone.View), ви повинні використовувати ім'я властивості DOM className, але якщо його встановлюватиattributes хеш / методу (як в цьому прикладі) , ви повинні використовувати ім'я атрибута, class.
Станом на Backbone 0.9.9:
При оголошенні View ... el, tagName, idіclassName тепер можуть бути визначені як функції, якщо ви хочете їх значення повинні бути визначені під час виконання.
Я згадую це на випадок ситуації, коли це було б корисно як альтернатива використанню attributes методу, як показано.
Використання існуючого елемента
Якщо ви використовуєте існуючий елемент (наприклад, перехід elдо конструктора подання) ...
var item = new View( { el : some_el } );
... тоді attributesне буде застосовано до елемента. Якщо бажані атрибути не встановлені на елементі, або ви не хочете , щоб дублювати дані в своєму класі виду і інше місце, то ви можете додати initializeметод у вашому виді конструктора , який відноситься attributesдо el. Щось на зразок цього (за допомогою jQuery.attr):
View.prototype.initialize = function ( options ) {
this.$el.attr( _.result( this, 'attributes' ) );
};
Використання el , візуалізація, уникаючи обгортки
У більшості прикладів, які я бачив, вигляд el служить безглуздим елементом-обгорткою, всередині якого потрібно вручну написати «семантичний» код.
Немає жодної причини view.elбути "безглуздим елементом обгортки". Насправді це часто порушує структуру DOM. Якщо клас представлення представляє <li>елемент, наприклад, його потрібно відобразити як <li>- візуалізація як як <div>або будь-якого іншого елемента порушить модель вмісту. Швидше за все , ви хочете зосередитися на правильному налаштуванні елемента вашої точки зору (використовуючи властивості , як tagName, classNameі id) , а потім робить його зміст в подальшому.
Варіанти, як забезпечити взаємодію об’єктів вигляду Backbone із DOM, широко відкриті. Є 2 базові початкові сценарії:
Ви можете приєднати існуючий елемент DOM до подання Backbone.
Ви можете дозволити Backbone створити новий елемент, який відключений від документа, а потім якось вставити його в документ.
Існують різні способи генерування вмісту для елемента (встановіть літеральний рядок, як у вашому прикладі; використовуйте бібліотеку шаблонів, як Вуса, Ручки тощо). Як слід використовуватиel властивість подання, залежить від того, що ви робите.
Існуючий елемент
Ваш приклад рендерингу передбачає, що у вас є існуючий елемент, який ви призначаєте поданню, хоча ви не показуєте екземпляра подань. Якщо це так, і елемент уже є в документі, можливо, ви захочете зробити щось подібне (оновіть вміст el, але не змінюйте elйого):
render : function () {
this.$el.html( "Some stuff" );
}
http://jsfiddle.net/vQMa2/1/
Сформований елемент
Скажімо, у вас немає існуючого елемента, і ви дозволяєте Backbone згенерувати його для вас. Ви можете хотіти зробити що - щось подібне (але це, ймовірно , краще Архітектор речі , так що ваша думка не несе відповідальності за знання про себе нічого зовні):
render : function () {
this.$el.html( "Some stuff" );
$( "#some-container" ).append( this.el );
}
http://jsfiddle.net/vQMa2/
Шаблони
У моєму випадку я використовую шаблони, наприклад:
<div class="player" id="{{id}}">
<input name="name" value="{{name}}" />
<input name="score" value="{{score}}" />
</div>
<!-- .player -->
Шаблон представляє повний вигляд. Іншими словами, навколо шаблону не буде обгортки - div.playerце буде корінь або найвіддаленіший елемент мого подання.
Мій клас гравців буде виглядати приблизно так (на дуже спрощеному прикладі render()):
Backbone.View.extend( {
tagName : 'div',
className : 'player',
attributes : function () {
return {
id : "player-" + this.model.cid
};
},
render : function {
var rendered_template = $( ... );
this.$el.empty().append( rendered_template.children() );
}
} );