#javascript #view #backbone.js
#javascript #Вид #backbone.js
Вопрос:
У меня вопрос о теге el в элементе представления с динамической загрузкой. Я прикрепляю прослушиватель кликов к <a>
тегу, который будет динамически загружать элемент представления (отображать его из шаблона, заполнять некоторый контент через ajax и т.д.). В настоящее время я реализовал это следующим образом:
MyDynamicView = Backbone.View.extend({
el: "a#dynamic-launcher",
events: {
"click": "launch"
},
initialize: function(){
_.bindAll(this, "render");
},
launch: function(e){
e.preventDefault();
this.render();
},
render: function(){
// do template/ajax/whatever.
}
});
Это работает довольно хорошо, но это мешает мне делать некоторые вещи. Например, если бы я хотел добавить другое событие, которое было вызвано чем-то из моего нового динамического представления, я не смог бы этого сделать (поскольку события отображаются только под родительским el
).).
Таким образом, альтернативой может быть родительское представление, которое знает о том, какой элемент запускает динамический элемент, а затем создает / визуализирует его.
velo.AppView = Backbone.View.extend({
el: "body",
events: {
"click a#dynamic-launcher": "launchDynamicView"
},
launchDynamicView: function(e){
e.preventDefault();
new MyDynamicView(); // Or something - Maybe I need to call render. Not sure.
}
});
Имеет ли этот второй метод больше смысла?
Любые рекомендации были бы великолепны!
Спасибо.
Ответ №1:
Самое простое решение — иметь
MyDynamicView = Backbone.View.extend({
el: "div",
events: {
"click a#dynamic launcher": "launch"
},
initialize: function(){
_.bindAll(this, "render");
el.append($("<a></a>", {
id: "#dynamic-launcher"
}));
},
launch: function(e){
e.preventDefault();
this.render();
},
render: function(){
// render link again?
// do template/ajax/whatever.
}
});
Ваше представление должно содержать ссылку, а не быть ссылкой.
Комментарии:
1. Это не то, что я ищу, хотя — ссылка, которая запускает представление, может находиться в совершенно другой части страницы, чем та, которую в конечном итоге отображает представление. Ссылка должна была быть отрисована до отрисовки представления.
2. @idbentley Ах. Затем вам нужно будет прикрепить какой-то
Controller
способ подключения ссылки / кнопки к созданию новогоView
объекта где-нибудь. Похоже скорее наView
->Controller
->View
отношение, чем наParentView
->ChildView
Ответ №2:
Похоже, вы не используете backbone Views по назначению. Вы привязываете событие к#dynamic-launcher, но этот элемент не является частью представления, в котором определена привязка этого события. Ваша вторая попытка с AppView лучше.
Конечно, реализация зависит от целей вашего приложения, но, возможно, что-то вроде этого — это то, что вам нужно:
Начальный скелет начальной HTML-страницы:
<html>
<head><!-- include your javascript --></head>
<body></body>
</html>
Представление приложения
AppView
events: {
"click a#dynamiclauncher" : "launch"
}
render: function(){
$('body').html $(el).html(this.template())
}
launch: function(){
$(el).find('.dynamic-view-location').html new DynamicView.render().el
}
Соответствующий AppTemplate
<p>
Hello world
<a id="dynamic-launcher">Launch Dynamic View</a>
<div class=".dynamic-view-location"></div>
</p>
Динамическое представление
DynamicView
render: function(){
$(this.el).html(this.template())
}
Соответствующий шаблон динамического представления
Комментарии:
1. По сути, это то, что я делаю во втором случае, за исключением того, что я хочу создать динамическое представление из шаблона во время запуска, а не во время рендеринга. Я бы также отметил, что вы можете использовать
this.$('selector')
для выбора относительно текущего представления (а не$(el).find(selector)
. Я согласен, что это более правильно, чем то, что я изначально предложил, но я не вижу, что это добавляет к моему второму предложению.2. Время запуска AppView — это время рендеринга для динамического представления. HTML для динамического представления не будет сгенерирован, пока не будет нажата эта ссылка!
3. спасибо за совет по этому поводу.$ (‘selector’). Буду использовать это в будущем!