私はここから正確なコードを使用しています: http://jsfiddle.net/sameersegal/NHAvS/これはバックボーン構造にあり、私がやりたいことは、モデル、ビュー、およびコレクションの 3 つの異なるファイルにそれらを分離することです。このjsfiddleでわかるように、それらすべて(MVC)は同じファイルにあります。これを行った後、私の問題は、モデルとビューとコレクションがお互いを認識していないことです。これらは分離された部分です:
モデル:
define([
"jquery",
"underscore",
"backbone"
], function($,_, Backbone){
var datapoint = Backbone.Model.extend({
initialize: function(x) {
this.set({
x: x
});
},
type: "point",
randomize: function() {
this.set({
x: Math.round(Math.random() * 10)
});
}
});
return DatapointModel;
});
/////////////////////////////////////////////// ////// コレクション:
define([
"underscore",
"backbone",
"js/models/hitMissModel"
],function(_, Backbone, DatapointModel){
var dataSeriesCollection = Backbone.Collection.extend({
model : DatapointModel,
fetch: function() {
this.reset();
this.add([
new DataPointModel(10),
new DataPointModel(12),
new DataPointModel(15),
new DataPointModel(18)
]);
},
randomize: function() {
this.each(function(m) {
m.randomize();
});
}
});
return DataSeriesCollection;
});
/////////////////////////////////////////////// ///// 意見:
define([
"jquery",
"underscore",
"backbone",
"d3",
"js/models/DatapointModel",
"js/collections/DataseriesCollection",
"text!templates/DataSeries.html"
], function($, _ , Backbone, d3 ,
dataPointModel,
DataSeriesCollection){
var BarGraphView = Backbone.View.extend({
el : $("#graph"),
headerTemplate : _.template(HeaderTemplate),
DataPointTemplate : _.template(DataPointTemplate),
initialize : function(){
_.bindAll(this, "render", "frame");
this.collection.bind("reset", this.frame);
this.collection.bind("change", this.render);
this.chart = d3.selectAll($(this.el)).append("svg").attr("class", "chart").attr("width", w).attr("height", h).append("g").attr("transform", "translate(10,15)");
this.collection.fetch();
},
render : function(){
//this.licenseModel.fetch();
this.$el.html(this.DataPointTemplate());
return this;
},
renderGraph: function() {
var data = this.collection.models;
var x = d3.scale.linear().domain([0, d3.max(data, function(d) {
return d.get("x");
})]).range([0, w - 10]);
var y = d3.scale.ordinal().domain([0, 1, 2, 3]).rangeBands([0, h - 20]);
var self = this;
var rect = this.chart.selectAll("rect").data(data, function(d, i) {
return i;
});
rect.enter().insert("rect", "text").attr("y", function(d) {
return y(d.get("x"));
}).attr("width", function(d) {
return x(d.get("x"));
}).attr("height", y.rangeBand());
rect.transition().duration(1000).attr("width", function(d) {
return x(d.get("x"));
}).attr("height", y.rangeBand());
rect.exit().remove();
var text = this.chart.selectAll("text").data(data, function(d, i) {
return i;
});
text.enter().append("text")
.attr("x", function(d) {
return x(d.get("x"));
})
.attr("y", function(d,i) { return y(i) + y.rangeBand() / 2; })
.attr("dx", -3) // padding-right
.attr("dy", ".35em") // vertical-align: middle
.attr("text-anchor", "end") // text-align: right
.text(function(d) { return d.get("x");});
text
.transition()
.duration(1100)
.attr("x", function(d) {
return x(d.get("x"));
})
.text(function(d) { return d.get("x");});
},
frame: function() {
this.chart.append("line").attr("y1", 0).attr("y2", h - 10).style("stroke", "#000");
this.chart.append("line").attr("x1", 0).attr("x2", w).attr("y1", h - 10).attr("y2", h - 10).style("stroke", "#000");
}
});
$(function() {
var dataSeriesCollection = new DataSeriesCollection();
new BarGraphView({
collection: dataSeriesCollection
}).render();
setInterval(function() {
DataSeriesCollection.randomize();
}, 2000);
});
return BarGraphView;
});
このエラー「 w is not defined 」が表示されました。これは、モデルで定義された「w」がビューで認識されていないことを示していますが、追加しました。
では、別々のファイルを連携させるために欠けている部分を教えていただけますか?