Geçerli uygulamamda backbone uygulamasının uygulamasında eksik görünen çevrelerde dolaşıyorum. Sorun, sayfa için çeşitli alt görünümleri (bir grafik, bir bilgi tablosu, vb.) Başlatan bir master AppView'um var. Benim arzum, gezinirken iletilen bir parametre bayrağına bağlı olarak sayfanın düzenini değiştirebilmektir.Omurga Görünümü Yuvalama
Karşılaştığım şey, şablonun oluşturulduktan sonra yer alacağı dom öğelerine gönderme yapan alt görünümlerin, ana AppView başlatma işlemi sırasında bu öğelere erişemediği bir durumdur. Öyleyse asıl soru, her olay için doğru dom elemanlarının doğru şekilde kurulmasını sağlamak için nasıl bir süreç oluşturduğunu nasıl temin ederim?
Aşağıdaki kodla, LayoutView'umdaki bir model değişikliğine bağlı bir etkinliğim varsa, düzen oluşturulur, ancak sonraki görünümler düzgün şekilde oluşturulmaz. Kibirlendiğim bir şey, tüm görünümleri .el 'değerlerini html yapısı içindeki statik bir öğeye ayarlamaktı. Bu, gerçekleşmesini sağlar, ancak '.el' kullanılarak sağlanan güzel kapsam belirleme yeteneğinden uzaklaşır.
Örnek Kod:
//Wrapped in jquery.ready() function...
//View Code
GraphView = Backbone.View.extend({ // init, model bind, template, supporting functions});
TableView = Backbone.View.extend({ // init, model bind, template, supporting functions});
LayoutView = Backbone.view.extend({
initialize: function() {
this.model.bind('change:version', this.render, this);
},
templateA = _.template($('#main-template').html()),
templateB = _.template($('#secondary-template').html()),
render: function() {
if ('main' == this.model.get('version')) {
this.el.html(this.templateA());
} else {
this.el.html(this.templateB());
}
},
});
MainView = Backbone.View.extend({
initialize: function() {
this.layoutView = new LayoutView({
el: $('#layoutContainer'),
model: layout,
});
this.graphView = new GraphView({
el: $('.graphContainer'),
model: graph
});
this.tableView = new TableView({
el: $('#dataTableContainer',
model: dataSet
});
},
});
// Model Code
Layout = Backbone.Model.extend({
defaults: {
version: 'main',
},
});
Graph = Backbone.Model.extend({});
dataSet = Backbone.Model.extend({});
// Router code...
// Fire off the app
AppView = new MainView($('#appContainer'));
// Create route, start up backbone history
HTML: Kolaylık olması açısından Sadece iki düzenleri arasında div'leri yeniden düzenlenmiş.
<html>
<head>
<!-- include above js and backbone dependancies -->
</head>
<body>
<script type="text/template" id="main-template">
<div class="graphContainer"></div>
<div class="dataTableContainer"></div>
<div>Some other stuff to identify that it's the main template</div>
</script>
<script type="text/template" id="secondary-template">
<div class="dataTableContainer"></div>
<div>Rock on layout version two!</div>
<div class="graphContainer"></div>
</script>
<div id="appContainer">
<div id="nav">
<a href="#layout/main">See Layout One</a>
<a href="#layout/secondary">See Layout Two</a>
</div>
<div id="layoutContainer"></div>
</div>
</body>
</html>
Herhangi birinizin sahip olabileceği içgörüyü/girdiyi takdir edin. Teşekkürler!
Sadece FYI, kodunuzda bir sürü yazım hatası var - bunların gerçek sözdizimi hataları değil, kopyala/yapıştır sorunları olduğunu varsaymak güvenli midir? – nrabinowitz
Blame kopyala/yapıştır, alttaki mantık, umarım hala iletiliyor. Bunu işaret ettiğin için teşekkürler. – aztechy