切换树列表 Backone 和木偶中的分支
Toggle Tree List Branches in Backone and Marionette
我有一个使用Backone和木偶的嵌套树列表。 我想通过单击分支li
来切换每个具有叶子的分支的视图。
当我单击树中的第二级节点以扩展它们时,存在一个错误。 单击Car
或Truck
节点最终会关闭分支,而不是打开下一级别。 我不确定如何解决此错误。
这是我的代码的小提琴:http://jsfiddle.net/aeao3Lec/
这是我的JavaScript,数据和模板:
JavaScript:
var TheModel = Backbone.Model.extend({});
var TheCollection = Backbone.Collection.extend({
model: TheModel,
});
var App = new Backbone.Marionette.Application();
App.addRegions({
mainRegion: '.main-region'
});
var TreeItemView = Backbone.Marionette.CompositeView.extend({
initialize: function() {
if ( this.model.get('children') ) {
this.collection = new TheCollection( this.model.get('children') );
}
},
tagName: 'ul',
className: 'tree-list',
template: _.template( $('#tree-template').html() ),
serializeData: function () {
return {
item: this.model.toJSON()
};
},
attachHtml: function(collectionView, childView) {
collectionView.$('li:first').append(childView.el);
},
events: {
'click .js-node': 'toggle'
},
toggle: function(e) {
var $e = $(e.currentTarget);
$e.find(' > .tree-list').slideToggle();
}
});
var TreeRootView = Backbone.Marionette.CollectionView.extend({
tagName: 'div',
className: 'tree-root',
childView: TreeItemView
});
var theCollection = new TheCollection(obj_data);
App.getRegion('mainRegion').show( new TreeRootView({collection: theCollection}) );
模板:
<div class="main-region">
</div>
<script type="text/template" id="tree-template">
<li class="js-node">
<% if (item.children) { %>
Click to toggle -
<% } %>
<%- item.title %>
</li>
</script>
数据:
var obj_data = {
"title": "Ford",
"children": [
{
"title": "Car",
"children": [
{
"title": "Focus",
},
{
"title": "Taurus"
}
]
},
{
"title": "Truck",
"children": [
{
"title": "F-150"
}
]
}
]
};
问题是您的视图与.js-node
类有几个嵌套元素。单击父元素时,将显示子元素.js-node
元素,但是当您单击其中一个元素时,事件会冒泡并重新触发父.js-node
上的事件,这将关闭您刚刚单击的子项。
您可以通过调用来阻止此事件冒泡
e.stopImmediatePropagation();
我已经像这样更新了您的切换方法,它可以工作:
toggle: function(e) {
var $e = $(e.currentTarget);
$e.children('.tree-list').slideToggle();
e.stopImmediatePropagation();
}
http://jsfiddle.net/CoryDanielson/aeao3Lec/2/
我看到的更大的问题是您的数据并不是真正的集合......是一棵树。CollectionView 实际上用于渲染模型的平面数组,而不是嵌套数组。您应该使用嵌套在彼此内部的多个 CollectionView 来呈现此数据...随着 TreeItemView 复杂性的增加,这将开始导致问题。
编辑:不,您使用的是非常适合渲染树的复合视图。
相关文章:
- 要求输入在数据列表中
- 从javascript创建一个列表
- 如何使用jQuery选择下拉列表的值
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- Javascript按钮下拉列表
- 如何使用json将对象列表从java转换为javascript
- 区分JSON中的矩阵和列表列表
- jQuery表单添加不适用于下拉列表
- 用每小时的差值填充数组/列表-从下拉列表中给定两个时间值
- 接受不在列表中的值-引导组合框
- 禁用jQuery中的下拉列表
- 从HTTPGET返回一个自定义对象列表,以便在Angular 2应用程序中使用
- 如何在javascript中迭代数字列表
- 如何在按钮中显示下拉列表中选定的元素
- 为什么HTML5拖放的目标是孩子?(可排序列表)
- 鼠标悬停事件影响列表中所有行中的按钮,而不仅仅是特定按钮
- 使用图像数组列表的simplegallary.js显示适合桌面屏幕的图像
- 如何在从多选下拉列表中选择选项值时动态生成文本框
- 切换树列表 Backone 和木偶中的分支