問題は、'name' 以外のすべてのオブジェクト属性が、テンプレートからアクセスしたときにコンソールでエラー 'id/url/whatever is not defined' を呼び出すことです。「名前」だけのテンプレートは問題なく表示され、正しい名前が表示されますが、別の属性を呼び出すとすぐに、たとえば. id
またはurl
、壊れます。ビューに渡されるオブジェクトは、解析された静的 JSON ファイルであり、すべてのアイテムが同じレベルにあり、コンソールからアクセスできます。collectionName.models[0].get('id');
私が混乱したのは、 name 属性が、バックボーン/アンダースコアコードのどこかにデフォルトとして事前定義されているかのように機能することです。
非常に明白な何かが欠けていますか?コンソールからモデルデータにアクセスできるので、ビュー自体のデータの扱い方に問題があると思いますが、いくつかの方法で書き直してみましたが、違いはないようです。
関連するすべてのコード。
渡されたオブジェクト形式。これはcollectionName.models[0].attributes;
、コンソールに返されるものでもあります。
[{
"id":"0",
"name": "Building1",
"url": "building_1",
"floors":[{
"id":"0",
"name":"Ground Floor",
"image":"",
"rooms":[{
"id": "r_1",
"name": "Room 1",
},
{
"id": "r_2",
"name": "Room 2"
}]
}
}]
}
テンプレート コードの例:
<span class="name"><%= name %></span>
<%= id %> <%= url %>
ルーターコード:
routes: {
'': 'intro', // this route is using pretty much identical code and works fine, the model has the exact same format, the only difference is that all attributes work.
':id': 'firstLevel'
},
firstLevel: function (id) {
window.singleBuilding = new ThisBuilding({}, {idBuilding: id});
window.singleBuilding.fetch();
this.floorView = new FloorList({
collection: window.singleBuilding
});
var $intro = $('#intro');
$intro.empty();
$intro.append(this.floorView.render().el);
}
ビュー:
window.FloorSingleList = Backbone.View.extend({
className: 'floor-list',
initialize: function () {
this.template = _.template(tpl.get('floors-list-item'));
_.bindAll(this, 'render');
this.model.bind('change', this.render);
this.testModel = this.model.attributes; // I tried passing the attributes directly to the templatewithout .toJSON(), which worked exactly the same, as in only the 'name' attribute worked
},
render: function () {
console.log("The test data is:", this.testModel);
console.log("The actual model data is:", this.model);
var renderedContent = this.template(this.model.toJSON());
$(this.el).html(renderedContent);
return this;
}
});
window.FloorList = Backbone.View.extend({
tagName: 'section',
className: 'intro-list',
initialize: function () {
this.template = _.template(tpl.get('intro-list'));
_.bindAll(this, 'render');
this.collection.bind('reset', this.render, this);
this.collection.bind('change', this.render, this);
},
render: function (eventName) {
var $introList;
var collection = this.collection;
$(this.el).html(this.template({ }));
$introList = this.$('.intro-list');
collection.each(function (building) {
var view = new FloorSingleList({
model: building,
collection: collection
});
$introList.append(view.render().el);
});
return this;
}
});
モデルコード:
window.ThisBuilding = Backbone.Collection.extend({
model : Building,
initialize: function(models, options) {
// Initialising the argument passed on from the router.
this.idBuilding = options.idBuilding;
return this;
},
url : function(){
return "data.json"
},
parse: function (response) {
console.log("Passed parameters are :", this.idBuilding); // Returns the request parameters passed from the router.
return response[this.idBuilding];
}
});
テンプレートとブートストラップ
// templates are loaded during the bootstrap
tpl.loadTemplates(['header', 'intro-list', 'floors-list-item', 'building-list-item'], function() {
window.App = new ExampleApp();
Backbone.history.start();
});