Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript backbone.js从JSON呈现多livel ul列表_Javascript_Backbone.js - Fatal编程技术网

Javascript backbone.js从JSON呈现多livel ul列表

Javascript backbone.js从JSON呈现多livel ul列表,javascript,backbone.js,Javascript,Backbone.js,我正在从服务器获取对象集合 [ {"id":1,"name":"test1","parent_id":null}, {"id":2,"name":"test2","parent_id":null}, {"id":3,"name":"test3","parent_id":2}, {"id":4,"name":"test4","parent_id":2} ] 我想把json转换成ul列表 <ul> <li>test1</li> <li>

我正在从服务器获取对象集合

[
 {"id":1,"name":"test1","parent_id":null},
 {"id":2,"name":"test2","parent_id":null},
 {"id":3,"name":"test3","parent_id":2},
 {"id":4,"name":"test4","parent_id":2}
]
我想把json转换成ul列表

<ul>
  <li>test1</li>
  <li>
    <ul>
      test2
      <li>test3</li>
      <li>test4</li>
    </ul>
  </li>
</ul>
  • 测试1
    • 测试2
    • 测试3
    • 测试4

如何呈现它?

如果您向我们解释您是如何组织应用程序的,我们可能会更好地回答您

到目前为止,我能说的是,最好的策略是逐个渲染模型。 看下面的句子,更好地理解我在说什么

我还假设您使用jquery

在该示例中,主应用程序中有一个应用于整个集合(addAll)的函数,另一个应用于单个模型

// Add all items in the **Todos** collection at once.
addAll: function() {
  MYCOLLECTION.each(this.addOne);
},

addOne: function(todo) {
  var view = new TodoView({model: MYMODEL});
  this.$("#list").append(view.render().el);
},
在这个框架中,您只需要在单个模型函数的视图中的view.render()中进行一些编码,如下所示

  el:$('ul .test0'),
  render: function() {
  if (!_.isNull(this.model.get('parent_id')) ){
      if($("." + this.model.get('parent_id')).length == 0) { 
        //the class doesn't exist because the <ul> hasn't been created yet
        //so create the <ul> tag
        $('#'+this.model.get('parent_id')).append("<ul class='"+this.model.get('id')+"'></ul>");
        }
      //now append the <li> element
      $('.'+this.model.get('parent_id')).append("<li id='"+this.model.get('id')+"'>"+this.model.get('name')+"</li>");
      }
  else{
        $(this.el).append("<li id='"+this.model.get('id')+"'>"+this.model.get('name')+"</li>");
        }
  this.$el.html(this.template(this.model.toJSON()));
  this.$el.toggleClass('done', this.model.get('done'));
  this.input = this.$('.edit');
  return this;
},
 <ul class='1'>
   <li id='1'>test1</li>
   <li id='2'>test2</li>
   <ul class='2'>
     <li id='3'>test3</li>
     <li id='4'>test4</li>
   </ul>
 </ul>
el:$('ul.test0'),
render:function(){
if(!.isNull(this.model.get('parent\u id')){
if($(“+this.model.get('parent_id')).length==0){
//该类不存在,因为尚未创建
    //因此,创建
      标记 $(“#”+this.model.get('parent_id')).append(“
        ”; } //现在附加
      • 元素 $('.+this.model.get('parent_id')).append(“
      • ”)+this.model.get('name')+“
      • ”); } 否则{ $(this.el).append(“
      • ”+this.model.get('name')+“
      • ”); } this.el.html(this.template(this.model.toJSON()); this.el.toggleClass('done',this.model.get('done'); this.input=this.$('.edit'); 归还这个; },
    最后你会有一个这样的列表

      el:$('ul .test0'),
      render: function() {
      if (!_.isNull(this.model.get('parent_id')) ){
          if($("." + this.model.get('parent_id')).length == 0) { 
            //the class doesn't exist because the <ul> hasn't been created yet
            //so create the <ul> tag
            $('#'+this.model.get('parent_id')).append("<ul class='"+this.model.get('id')+"'></ul>");
            }
          //now append the <li> element
          $('.'+this.model.get('parent_id')).append("<li id='"+this.model.get('id')+"'>"+this.model.get('name')+"</li>");
          }
      else{
            $(this.el).append("<li id='"+this.model.get('id')+"'>"+this.model.get('name')+"</li>");
            }
      this.$el.html(this.template(this.model.toJSON()));
      this.$el.toggleClass('done', this.model.get('done'));
      this.input = this.$('.edit');
      return this;
    },
    
     <ul class='1'>
       <li id='1'>test1</li>
       <li id='2'>test2</li>
       <ul class='2'>
         <li id='3'>test3</li>
         <li id='4'>test4</li>
       </ul>
     </ul>
    
    • 测试1
    • 测试2
      • 测试3
      • 测试4
    明白了吗?
    希望这有帮助。

    如果您向我们解释您是如何组织应用程序的,我们可能会更好地回答您的问题

    到目前为止,我能说的是,最好的策略是逐个渲染模型。 看下面的句子,更好地理解我在说什么

    我还假设您使用jquery

    在该示例中,主应用程序中有一个应用于整个集合(addAll)的函数,另一个应用于单个模型

    // Add all items in the **Todos** collection at once.
    addAll: function() {
      MYCOLLECTION.each(this.addOne);
    },
    
    addOne: function(todo) {
      var view = new TodoView({model: MYMODEL});
      this.$("#list").append(view.render().el);
    },
    
    在这个框架中,您只需要在单个模型函数的视图中的view.render()中进行一些编码,如下所示

      el:$('ul .test0'),
      render: function() {
      if (!_.isNull(this.model.get('parent_id')) ){
          if($("." + this.model.get('parent_id')).length == 0) { 
            //the class doesn't exist because the <ul> hasn't been created yet
            //so create the <ul> tag
            $('#'+this.model.get('parent_id')).append("<ul class='"+this.model.get('id')+"'></ul>");
            }
          //now append the <li> element
          $('.'+this.model.get('parent_id')).append("<li id='"+this.model.get('id')+"'>"+this.model.get('name')+"</li>");
          }
      else{
            $(this.el).append("<li id='"+this.model.get('id')+"'>"+this.model.get('name')+"</li>");
            }
      this.$el.html(this.template(this.model.toJSON()));
      this.$el.toggleClass('done', this.model.get('done'));
      this.input = this.$('.edit');
      return this;
    },
    
     <ul class='1'>
       <li id='1'>test1</li>
       <li id='2'>test2</li>
       <ul class='2'>
         <li id='3'>test3</li>
         <li id='4'>test4</li>
       </ul>
     </ul>
    
    el:$('ul.test0'),
    render:function(){
    if(!.isNull(this.model.get('parent\u id')){
    if($(“+this.model.get('parent_id')).length==0){
    //该类不存在,因为尚未创建
      //因此,创建
        标记 $(“#”+this.model.get('parent_id')).append(“
          ”; } //现在附加
        • 元素 $('.+this.model.get('parent_id')).append(“
        • ”)+this.model.get('name')+“
        • ”); } 否则{ $(this.el).append(“
        • ”+this.model.get('name')+“
        • ”); } this.el.html(this.template(this.model.toJSON()); this.el.toggleClass('done',this.model.get('done'); this.input=this.$('.edit'); 归还这个; },
      最后你会有一个这样的列表

        el:$('ul .test0'),
        render: function() {
        if (!_.isNull(this.model.get('parent_id')) ){
            if($("." + this.model.get('parent_id')).length == 0) { 
              //the class doesn't exist because the <ul> hasn't been created yet
              //so create the <ul> tag
              $('#'+this.model.get('parent_id')).append("<ul class='"+this.model.get('id')+"'></ul>");
              }
            //now append the <li> element
            $('.'+this.model.get('parent_id')).append("<li id='"+this.model.get('id')+"'>"+this.model.get('name')+"</li>");
            }
        else{
              $(this.el).append("<li id='"+this.model.get('id')+"'>"+this.model.get('name')+"</li>");
              }
        this.$el.html(this.template(this.model.toJSON()));
        this.$el.toggleClass('done', this.model.get('done'));
        this.input = this.$('.edit');
        return this;
      },
      
       <ul class='1'>
         <li id='1'>test1</li>
         <li id='2'>test2</li>
         <ul class='2'>
           <li id='3'>test3</li>
           <li id='4'>test4</li>
         </ul>
       </ul>
      
      • 测试1
      • 测试2
        • 测试3
        • 测试4
      明白了吗?
      希望这有帮助。

      @DanieleB比我跑得快:)。。但我还是要展示我的方法,我认为非常相似:

      var data = [
        {"id":1,"name":"test1","parent_id":null},
        {"id":2,"name":"test2","parent_id":null},
        {"id":3,"name":"test3","parent_id":2},
        {"id":4,"name":"test4","parent_id":2}
      ]
      
      var NestedView = Backbone.View.extend({
        render: function(){
          this.$el.html( "<ul id='ul-null'></ul>" )
          this.collection.each( function( model ){ this.renderElement( model ) }, this )
        },
      
        renderElement: function( model ){
          var ul = this.getParentUl( model );
          this.appendElement( ul, model );
        },
      
        getParentUl: function( model ) {
          var ul = this.$el.find( "#ul-" + model.get( "parent_id" ) );
          if( ul.length == 0 ) {
            this.appendListInElement( model );
            ul = this.$el.find( "#ul-" + model.get( "parent_id" ) );
          }
      
          return ul;
        },
      
        appendListInElement: function( model ){
          var li = this.$el.find( "#li-" + model.get( "parent_id" ) );
          li.after( "<ul id='ul-" + model.get( "parent_id" ) + "'></ul>" );
        },
      
        appendElement: function( ul, model ){
          ul.append( "<li id='li-" + model.get( "id" ) + "'>" + model.get( "name" ) + "</li>" );
        }
      });
      
      var elements = new Backbone.Collection( data );
      var nestedView = new NestedView({ el: "#wrapper", collection: elements });
      nestedView.render();
      ​
      ​
      
      var数据=[
      {“id”:1,“name”:“test1”,“parent_id”:null},
      {“id”:2,“name”:“test2”,“parent_id”:null},
      {“id”:3,“name”:“test3”,“parent_id”:2},
      {“id”:4,“name”:“test4”,“parent_id”:2}
      ]
      var NestedView=Backbone.View.extend({
      render:function(){
      这是。$el.html(“”)
      this.collection.each(函数(模型){this.renderement(模型)},this)
      },
      渲染:功能(模型){
      var ul=this.getParentUl(模型);
      本附录元素(ul,型号);
      },
      getParentUl:函数(模型){
      var ul=this.$el.find(“#ul-”+model.get(“父id”);
      如果(ul.length==0){
      本附录为水泥(模型);
      ul=this.$el.find(“#ul-”+model.get(“父id”));
      }
      返回ul;
      },
      appendListInElement:函数(模型){
      var li=this.$el.find(“#li-”+model.get(“parent#u id”);
      li.after(“
        ”+model.get(“name”)+“”); } }); var元素=新主干。收集(数据); var nestedView=newnestedview({el:#wrapper',collection:elements}); nestedView.render(); ​ ​

      @DanieleB跑得比我快:)。。但我还是要展示我的方法,我认为非常相似:

      var data = [
        {"id":1,"name":"test1","parent_id":null},
        {"id":2,"name":"test2","parent_id":null},
        {"id":3,"name":"test3","parent_id":2},
        {"id":4,"name":"test4","parent_id":2}
      ]
      
      var NestedView = Backbone.View.extend({
        render: function(){
          this.$el.html( "<ul id='ul-null'></ul>" )
          this.collection.each( function( model ){ this.renderElement( model ) }, this )
        },
      
        renderElement: function( model ){
          var ul = this.getParentUl( model );
          this.appendElement( ul, model );
        },
      
        getParentUl: function( model ) {
          var ul = this.$el.find( "#ul-" + model.get( "parent_id" ) );
          if( ul.length == 0 ) {
            this.appendListInElement( model );
            ul = this.$el.find( "#ul-" + model.get( "parent_id" ) );
          }
      
          return ul;
        },
      
        appendListInElement: function( model ){
          var li = this.$el.find( "#li-" + model.get( "parent_id" ) );
          li.after( "<ul id='ul-" + model.get( "parent_id" ) + "'></ul>" );
        },
      
        appendElement: function( ul, model ){
          ul.append( "<li id='li-" + model.get( "id" ) + "'>" + model.get( "name" ) + "</li>" );
        }
      });
      
      var elements = new Backbone.Collection( data );
      var nestedView = new NestedView({ el: "#wrapper", collection: elements });
      nestedView.render();
      ​
      ​
      
      var数据=[
      {“id”:1,“name”:“test1”,“parent_id”:null},
      {“id”:2,“name”:“test2”,“parent_id”:null},
      {“id”:3,“name”:“test3”,“parent_id”:2},
      {“id”:4,“name”:“test4”,“parent_id”:2}
      ]
      var NestedView=Backbone.View.extend({
      render:function(){
      这是。$el.html(“”)
      this.collection.each(函数(模型){this.renderement(模型)},this)
      },
      渲染:功能(模型){
      var ul=this.getParentUl(模型);
      本附录元素(ul,型号);
      },
      getParentUl:函数(模型){
      var ul=this.$el.find(“#ul-”+model.get(“父id”);
      如果(ul.length==0){
      本附录为水泥(模型);
      ul=this.$el.find(“#ul-”+model.get(“父id”));
      }
      返回ul;
      },
      appendListInElement:函数(模型){
      var li=this.$el.find(“#li-”+model.get(“parent#u id”);
      li.after(“