当前位置: 首页 > 知识库问答 >
问题:

脊梁骨js-解析并显示大型xml提要

东门宜
2023-03-14

我正在从xml提要创建主干集合。xml提要返回110篇文章(它是外部的,无法返回更少的文章)。我加载到主干集合中,如下所示:

        parse: function (data) {
            xml = data;

            $(xml).find('item').each(function (index) {
                title = $(this).find('title').text();
                description = $(this).find('description').text();
                author = $(this).find('author').text();
                pubDate = $(this).find('pubDate').text();
                img = $(description).find('img:first');
                if(img.length){
                    src = img.attr('src');
                }
                parsed.push({id:id, title: title, author:author, 
                            description:description, pubDate:pubDate, src:src});

            });

            return parsed;
        },

然后,我在列表底部显示带有“加载更多”按钮的前10个项目。当用户单击“加载更多”时,我想从主干集合中加载接下来的10个项目。在视图中,我这样做:

    loadMore: function(){
        var ul = $('#news-list');
        var id = ul.find('li:last-child').data("id");
        var li="";
         _.every(this.collection.toJSON(), function(item) {
                if(item.id>id){
                    li += '<li class="topcoat-list__item" data-id="'+item.id+'">';
                    li += '<a href="#news-item/<%= item.id %>">';
                    li += '<img height="30" width="30" src="'+item.src+'">';
                    li += '<p>'+item.title+'</p>';
                    li += '<p>'+item.pubDate+'</p>';
                    li += '<span class="chevron"></span>';
                    li += '</a>';
                    li += '</li>';
                }  

                if(item.id>(id+10)){
                    console.log('in loadMore if');
                    return false;
                }
                return true;
        });
        ul.append(li);
    }

因此,each循环遍历前10个项目,跳过它们,因为它们已经加载(并且小于最后一个li子项的id),然后在接下来的10个项目上创建列表元素html,然后退出。但这似乎效率低下。有没有更好的方法来完成这个过程

共有1个答案

姜献
2023-03-14

首先:考虑对li元素使用下划线模板,这将使其更加容易,而无需使用串联字符串来生成html代码块。

第二:如果您认为循环效率低下,请从您需要的项目开始(基于您的代码,未经测试,只是跳过不需要的循环)

var ul = $('#news-list');
var id = ul.find('li:last-child').data("id");

for (var i=(0+id);i<=(9+id);i++){ 

  var item = this.collection.at(i).toJSON();
  var li="";
  li += '<li class="topcoat-list__item" data-id="'+item.id+'">';
  li += '<a href="#news-item/<%= item.id %>">';
  li += '<img height="30" width="30" src="'+item.src+'">';
  li += '<p>'+item.title+'</p>';
  li += '<p>'+item.pubDate+'</p>';
  li += '<span class="chevron"></span>';
  li += '</a>';
  li += '</li>';

  ul.append(li);
}

使用下划线:

var ul = $('#news-list');
var id = ul.find('li:last-child').data("id");

for (var i=(0+id);i<=(9+id);i++){ 
  var li= _.template( $('#li-template').html(), {"item":this.collection.at(i).toJSON() } );
  ul.append(li);
}

$(“#li模板”)。html()类似于:

<li class="topcoat-list__item" data-id="<%= item.id%>">
<a href="#news-item/<%= item.id %>">
<img height="30" width="30" src="<%= item.src%>">
<p><%= item.title %></p>
<p><%= item.pubDate %></p>
<span class="chevron"></span>
</a>
</li>
 类似资料:
  • 使用Backbone.js作为Rails应用的前端框架。就Rails模型而言,我有一个发布模型和一个文章模型。每个出版物与许多文章相关联,并且每个文章只属于一个出版物。当用户决定删除一个出版物时,我希望所有相关的文章也被删除。我说的删除是指从数据库中删除。 以下代码适用于从数据库中删除指定的发布,但不适用于删除关联的项目: 我还试着移动这些文章。destroy()行在success函数中,但这也不

  • 假设我有这样一个json设置: 和一个这样的模型: 获取此json后,如何将设置为ItemCollection集合的项映射并将页码作为属性添加到集合中?

  • 问题内容: 我有非常大的XML文件要处理。我想将它们转换为具有颜色,边框,图像,表格和字体的可读PDF。我的机器上没有很多资源,因此,我需要我的应用程序对内存和处理器的寻址非常理想。 我进行了不起眼的研究,以使自己对所使用的技术有所了解,但是我无法确定什么是满足我的要求的最佳编程语言和API。我认为DOM不是一个选择,因为它会占用大量内存,但是带SAX解析器的Java是否可以满足我的要求? 有人还

  • 问题内容: 我需要一个XML解析器来解析大约1.8 GB的文件。 因此,解析器不应将所有文件加载到内存中。 有什么建议? 问题答案: 除了推荐的SAX解析之外,您还可以使用JDK(包javax.xml.stream)中包含的StAX API(一种SAX演进)。 StAX项目主页:http://stax.codehaus.org/Home 简介:http : //www.xml.com/pub/a/

  • 问题内容: 我有以下问题: 我有一个XML文件(大约1GB),并且必须上下迭代(即不连续;一个接一个),以便获取所需的数据并对其进行一些操作。最初,我使用了DOM Java包,但是很显然,在解析XML文件时,JVM达到了其最大堆空间并停止了运行。 为了解决这个问题,我想到的解决方案之一是找到另一个解析器,该解析器迭代XML中的每个元素,然后将其内容存储在硬盘上的临时SQLite数据库中。因此,通过

  • 通过Threejs先加载一个.FBX格式的三维模型文件,然后解析该文件中的骨骼动画信息。 加载器FBXLoader.js 引入FBX加载器相关文件 <!-- 引入fbx模型加载库FBXLoader --> <script src="https://www.wenjiangs.com/wp-content/uploads/three.js/examples/js/loaders/FBXLoader.