Ich bin neu bei backbone.js, und auch etwas Neues im Front-End-Bereich und habe noch nicht ganz herausgefunden, wie der Lebenszyklus funktioniert.Lebenszyklus einer Backbone.js Ansicht während ihrer Erstellung
Wir haben ein Django-Backend, das uns HTML-Templates liefert, die wir im Grunde nur als Frames verwenden. Die gesamte Logik wird in Backbone-Ansichten behandelt.
Das Problem, das ich derzeit habe, ist, dass ich versuche, ein Diagramm zu zeichnen, aber die Grafikfunktion findet die Ansicht nicht basierend auf der ID, da es nicht während der Renderfunktion existiert, aber ich bin mir nicht bewusst eines Weges, dies in einer späteren Phase zu erreichen.
Ich habe versucht, die Ansicht manuell in Chrome-Konsole zu erstellen, nachdem die Seite vollständig geladen hat und es funktioniert:
var main = new MainView();
main.showChart();
The View:
var ChartView = Backbone.View.extend({
title: 'Chart',
initialize: function() {
// This assures that this refers to this exact view in each function
// (except within asynchronous functions such as jquery each)
_.bindAll(this);
// Saving parameters given by parent
this.index = this.options.index;
// Retrieve the template from server
var template = _.template(getTemplate('chart.html'));
// Compile the template with given parameters
var compiledTemplate = template({'title': this.title});
// Set the compiled template to this instance's el-parameter
this.$el.append(compiledTemplate);
// Rendering the view
this.render();
},
render: function() {
var self = this;
// Draw the graph when the page is ready
$(function(){
self.drawGraph('chart1', this.line1Data);
});
// Render function should always return the instance
return this;
},
drawGraph : function(chartId, lineData) {
Morris.Line({
element: chartId,
data: [
{y: '2012', a: 100},
{y: '2011', a: 75},
{y: '2010', a: 50},
{y: '2009', a: 75},
{y: '2008', a: 50},
{y: '2007', a: 75},
{y: '2006', a: 100}
],
xkey: 'y',
ykeys: ['a'],
labels: ['Series A']
});
},
});
Wo es erstellt:
var chartWidgetView = new WidgetView({'contentView': new ChartView()});
this.initializeWidget(chartWidgetView);
this.$el.append(chartWidgetView.el);
Könnte mir jemand klären:
- Wie Backbone tatsächlich die Schaffung einer Ansicht umgehen? Was sind die verschiedenen Phasen?
- Wie soll ich mit dieser Situation umgehen, z.B. an welcher stelle meines code würde das element aus der html-template existieren, damit ich die grafikfunktion dafür aufrufen könnte?
- Oder ist meine Architektur nur grundlegend fehlerhaft? Soll ich das auf eine ganz andere Art und Weise versuchen?
Ich war in der Lage, das Problem zu lösen, indem ich explizit die render-Funktion aufgerufen habe, nachdem das ChartView erstellt und an seinen Elternknoten angehängt wurde: 'chartWidgetView.contentView.Render();'. Vielen Dank für die hervorragende Einsicht und den Link, ich werde das auf jeden Fall für die Zukunft beachten! Und ich werde auch meinen Code etwas umgestalten;) – jesseniem