【问题标题】:Read XML and append in view using Backbone js使用 Backbone js 读取 XML 并附加到视图中
【发布时间】:2017-04-04 16:56:49
【问题描述】:

如何使用 Backbone 读取 XML 并附加到视图中。

XML 文件已被读取并成功附加到视图中。但我不知道如何处理 Backbone 结构(使用它的模型)。

XML 文件(读取asseturlwidthheight

<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>

主干js代码

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 函数中处理它并不是一个好习惯。

【问题讨论】:

  • 您可能想要做的是为解析函数中的每个资产创建模型并将它们添加到资产集合中。在您的 listView 中,您可以像在 parse 函数中那样渲染它们,或者更好的方法是为每个模型创建一个视图并让视图自己渲染。这将是处理模型和视图的更重要的方式。
  • 这里有一些可以帮助你的帖子。 post1, post2

标签: javascript jquery xml backbone.js


【解决方案1】:

不要将渲染逻辑放入集合的parse 函数中。

集合的作用是管理模型并与 API 同步。 渲染是视图的责任

首先,让我们简化集合解析。在 Backbone 文档中,parse 应该只执行以下操作:

函数传递了原始的response 对象,并且应该返回 要添加到集合中的模型属性数组。

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();

【讨论】:

  • @Emile Bergeron...感谢您解决问题..请回复我未来对上述代码的疑问..
猜你喜欢
  • 2015-05-16
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多