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