读取 XML 并使用 Backbone js 追加到视图中
Read XML and append in view using Backbone js
如何阅读 XML 并在视图中附加 Backbone。
XML 文件已被读取并成功添加到视图中。但我不知道如何处理 Backbone 结构(使用其模型)。
XML 文件(读取 asseturl
, width
, height
)
<library>
<assets>
<asset asseturl="img_1.png" width="100" height="150"></asset>
<asset asseturl="img_2.png" width="200" height="250"></asset>
<asset asseturl="img_3.png" width="300" height="350"></asset>
</assets>
</library>
Backbonejs代码
var Book = Backbone.Model.extend();
var Books = Backbone.Collection.extend({
model: Book,
url: "file.xml",
parse: function (data)
{
var $xml = $(data);
return $xml.find('assets').map(function()
{
var bookTitle = $(this).find('asset').each(function(){
var this_url = $(this).attr('asseturl');
var this_width = $(this).attr('width');
var this_height = $(this).attr('height');
$('.character-list').append('<li><span class="asset char">'+
'<img width="'+this_width+'" height="'+this_height+'" src="'+this_url+'">'+
'</span></li>');
});
return {title: bookTitle};
}).get();
},
fetch: function (options)
{
options = options || {};
options.dataType = "xml";
return Backbone.Collection.prototype.fetch.call(this, options);
}
});
var bookListView = Backbone.View.extend({
initialize: function ()
{
this.listenTo(this.collection, "sync", this.render);
},
render: function ()
{
console.log(this.collection.toJSON());
}
});
var bks = new Books();
new bookListView({collection: bks});
bks.fetch();
HTML 要附加的代码
<ul class="character-list">
</ul>
尽管上面的追加功能对我有用,但在 Backbone parse
函数中处理它并不是一个好习惯。
不要将呈现逻辑放入集合的 parse
函数中。
集合的作用是管理模型并与API同步。 视图负责渲染。
首先,让我们简化集合解析。根据 Backbone 文档,parse
应该只执行以下操作:
The function is passed the raw response
object, and should return the
array of model attributes to be added to the collection.
parse: function(response) {
var $xml = $(response);
// this will return an array of objects
return $xml.find('assets').children('asset').map(function() {
var $asset = $(this);
// returns raw "model" attributes
return {
asseturl: $asset.attr('asseturl'),
width: $asset.attr('width'),
height: $asset.attr('height')
};
}).get();
},
然后,对每个资产做一个简单的视图:
var BookView = Backbone.View.extend({
tagName: 'li',
template: _.template('<span class="asset char"><img width="<%= width %>" height="<%= height %>" src="<%= asseturl %>"></span>'),
render: function() {
this.$el.html(this.template(this.model.toJSON()));
return this;
}
});
并且在列表视图中处理每个资产的渲染。
var BookListView = Backbone.View.extend({
initialize: function() {
this.childViews = [];
this.listenTo(this.collection, "sync", this.render);
},
render: function() {
this.$el.empty();
this.collection.each(this.renderBook, this);
return this;
},
renderBook: function(model) {
var view = new BookView({ model: model });
this.childViews.push(view);
this.$el.append(view.render().el);
},
});
使用方法:
var bks = new Books(),
view = new BookListView({ el: $('.character-list'), collection: bks });
view.render();
bks.fetch();
如何阅读 XML 并在视图中附加 Backbone。
XML 文件已被读取并成功添加到视图中。但我不知道如何处理 Backbone 结构(使用其模型)。
XML 文件(读取 asseturl
, width
, height
)
<library>
<assets>
<asset asseturl="img_1.png" width="100" height="150"></asset>
<asset asseturl="img_2.png" width="200" height="250"></asset>
<asset asseturl="img_3.png" width="300" height="350"></asset>
</assets>
</library>
Backbonejs代码
var Book = Backbone.Model.extend();
var Books = Backbone.Collection.extend({
model: Book,
url: "file.xml",
parse: function (data)
{
var $xml = $(data);
return $xml.find('assets').map(function()
{
var bookTitle = $(this).find('asset').each(function(){
var this_url = $(this).attr('asseturl');
var this_width = $(this).attr('width');
var this_height = $(this).attr('height');
$('.character-list').append('<li><span class="asset char">'+
'<img width="'+this_width+'" height="'+this_height+'" src="'+this_url+'">'+
'</span></li>');
});
return {title: bookTitle};
}).get();
},
fetch: function (options)
{
options = options || {};
options.dataType = "xml";
return Backbone.Collection.prototype.fetch.call(this, options);
}
});
var bookListView = Backbone.View.extend({
initialize: function ()
{
this.listenTo(this.collection, "sync", this.render);
},
render: function ()
{
console.log(this.collection.toJSON());
}
});
var bks = new Books();
new bookListView({collection: bks});
bks.fetch();
HTML 要附加的代码
<ul class="character-list">
</ul>
尽管上面的追加功能对我有用,但在 Backbone parse
函数中处理它并不是一个好习惯。
不要将呈现逻辑放入集合的 parse
函数中。
集合的作用是管理模型并与API同步。 视图负责渲染。
首先,让我们简化集合解析。根据 Backbone 文档,parse
应该只执行以下操作:
The function is passed the raw
response
object, and should return the array of model attributes to be added to the collection.
parse: function(response) {
var $xml = $(response);
// this will return an array of objects
return $xml.find('assets').children('asset').map(function() {
var $asset = $(this);
// returns raw "model" attributes
return {
asseturl: $asset.attr('asseturl'),
width: $asset.attr('width'),
height: $asset.attr('height')
};
}).get();
},
然后,对每个资产做一个简单的视图:
var BookView = Backbone.View.extend({
tagName: 'li',
template: _.template('<span class="asset char"><img width="<%= width %>" height="<%= height %>" src="<%= asseturl %>"></span>'),
render: function() {
this.$el.html(this.template(this.model.toJSON()));
return this;
}
});
并且在列表视图中处理每个资产的渲染。
var BookListView = Backbone.View.extend({
initialize: function() {
this.childViews = [];
this.listenTo(this.collection, "sync", this.render);
},
render: function() {
this.$el.empty();
this.collection.each(this.renderBook, this);
return this;
},
renderBook: function(model) {
var view = new BookView({ model: model });
this.childViews.push(view);
this.$el.append(view.render().el);
},
});
使用方法:
var bks = new Books(),
view = new BookListView({ el: $('.character-list'), collection: bks });
view.render();
bks.fetch();