Backbone.js 在图形(节点/树)模型中使用主干关系时遇到问题
我正在使用主干网从一些平面数据构建分层数据模型,在尝试使用关系模型时遇到了一个问题。以下代码的输出如下所示:Backbone.js 在图形(节点/树)模型中使用主干关系时遇到问题,backbone.js,marionette,backbone-relational,Backbone.js,Marionette,Backbone Relational,我正在使用主干网从一些平面数据构建分层数据模型,在尝试使用关系模型时遇到了一个问题。以下代码的输出如下所示: "D" "B" "C" "F" "G" "A" 其中每个字母对应于相关模型中的一个id。当我将关联添加到TreeNode模型中以形成关系时,树停止迭代,我只得到第一组结果(D>B>C),而不是我想要的(D>B>F)或(D>G>A)。下面是我添加关系时的输出: {"label":"Fred","language":"en",
"D"
"B"
"C"
"F"
"G"
"A"
其中每个字母对应于相关模型中的一个id。当我将关联添加到TreeNode模型中以形成关系时,树停止迭代,我只得到第一组结果(D>B>C),而不是我想要的(D>B>F)或(D>G>A)。下面是我添加关系时的输出:
{"label":"Fred","language":"en","id":"D","datatype":"number"}
{"label":"is friends with","language":"en","id":"B","datatype":"text"}
{"label":"Violet","language":"en","id":"C","datatype":"text"}
我是个新手,不确定我做得是否正确。这是示例代码(我尽可能地将其配对,并注意到问题所在)
提前感谢
<!DOCTYPE html>
<html>
<head>
<title>Relational Graph</title>
<meta charset="utf-8" />
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.1/underscore-min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.2/backbone-min.js"></script>
<script src="js/backbone.marionette.js"></script>
<script src="js/backbone.relational.js"></script>
</head>
<body>
<div id="model"></div>
<script>
$(document).ready(function(){
MainApp = new Backbone.Marionette.Application();
MainApp.addRegions({treeRegion: "#model"});
MainApp.addInitializer(function(options){
var trunk = things.search({id: "D"}).first();
var tree = new TreeNodeCollection(graphify(options.relationships, trunk));
var treeView = new TreeRoot({collection: tree});
this.treeRegion.show(treeView);
});
TreeNode = Backbone.RelationalModel.extend({
initialize: function(){
var nodes = this.get("nodes");
if (nodes){
this.nodes = new TreeNodeCollection(nodes);
this.unset("nodes");
}
},
render: function(){
var that = this;
TemplateManager.get(this.template, function(template){
var html = $(template).tmpl();
that.$el.html(html);
});
return this;
}
// !!! HERE IS THE PROBLEM - when I add this line, it stops looping through the tree :(
//, relations: [{type: Backbone.HasOne, key: 'id', relatedModel: "Thing"}]
});
TreeNodeCollection = Backbone.Collection.extend({model: TreeNode});
TreeView = Backbone.Marionette.CompositeView.extend({
template: "#node-template",
tagName: "ul",
initialize: function(){
this.collection = this.model.nodes;
},
appendHtml: function(collectionView, itemView){
collectionView.$("li:first").append(itemView.el);
}
});
TreeRoot = Backbone.Marionette.CollectionView.extend({itemView: TreeView});
Thing = Backbone.RelationalModel.extend();
Things = Backbone.Collection.extend({
model: Thing,
search: function(opts){
return new Things(this.where(opts));
}
});
Relationship = Backbone.RelationalModel.extend({
relations: [
{type: Backbone.HasOne, key: 's', relatedModel: Thing},
{type: Backbone.HasOne, key: 'p', relatedModel: Thing},
{type: Backbone.HasOne, key: 'o', relatedModel: Thing}
]
});
Relationships = Backbone.Collection.extend({
model: Relationship,
search: function(opts){
return new Relationships(this.where(opts));
}
});
things = new Things([
new Thing({label: 'Sam', language: 'en', id: 'A', datatype: 'text'}),
new Thing({label: 'Fred', language: 'en', id: 'D', datatype: 'number'}),
new Thing({label: 'Jake', language: 'en', id: 'E', datatype: 'text'}),
new Thing({label: 'Sally', language: 'en', id: 'F', datatype: 'number'}),
new Thing({label: 'is friends with', language: 'en', id: 'B', datatype: 'text'}),
new Thing({label: 'is working with', language: 'en', id: 'G', datatype: 'text'}),
new Thing({label: 'Violet', language: 'en', id: 'C', datatype: 'text'})
]);
relationships = new Relationships([
new Relationship({s: "A", p: "B", o: "C"}),
new Relationship({s: "A", p: "B", o: "D"}),
new Relationship({s: "A", p: "B", o: "E"}),
new Relationship({s: "A", p: "B", o: "F"}),
new Relationship({s: "D", p: "B", o: "C"}),
new Relationship({s: "D", p: "B", o: "F"}),
new Relationship({s: "A", p: "G", o: "F"}),
new Relationship({s: "D", p: "G", o: "A"})
]);
MainApp.start({things: things, relationships: relationships});
function arrUnique(field, arr){
var all = [];
arr.each(function(item){
all.push(item.get(field).get('id'));
});
return _.uniq(all);
}
function graphify(arr, obj){
var graphNew = [];
var uniqueSubjects = arrUnique("s", arr.search({s: obj}));
for (var i=0; i<uniqueSubjects.length; i++){
var subject = uniqueSubjects[i];
var newSubject = {id: subject};
var subNodes = [];
var uniquePredicates = arrUnique("p", arr.search({s: obj}));
for (var j=0; j<uniquePredicates.length; j++){
var predicate = uniquePredicates[j];
var newPredicate = {id: predicate};
var relatedObjects = [];
arr.each(function(o){
if (o.get("s").get("id") == subject && o.get("p").get("id") == predicate){
relatedObjects.push({id: o.get("o").get("id")});
}
});
newPredicate.nodes = relatedObjects;
subNodes.push(newPredicate);
}
newSubject.nodes = subNodes;
graphNew.push(newSubject);
}
return graphNew;
}
});
</script>
<script type="text/template" id="node-template">
<li><label><%= JSON.stringify(id) %></label></li>
</script>
</body>
</html>
关系图
$(文档).ready(函数(){
MainApp=新主干网.marionete.Application();
MainApp.addRegions({treeRegion:#model});
MainApp.addInitializer(功能(选项){
var trunk=things.search({id:D}).first();
var-tree=新的树集合(graphify(options.relationships,trunk));
var treeView=newtreeroot({collection:tree});
这个.treeRegion.show(treeView);
});
TreeNode=Backbone.RelationalModel.extend({
初始化:函数(){
var nodes=this.get(“节点”);
if(节点){
this.nodes=新的TreeNodeCollection(节点);
这是未设置的(“节点”);
}
},
render:function(){
var=这个;
TemplateManager.get(this.template,函数(template){
var html=$(模板).tmpl();
即.$el.html(html);
});
归还这个;
}
//!!!问题出在这里-当我添加这一行时,它将停止在树中循环:(
//,关系:[{type:Backbone.HasOne,key:'id',relatedModel:'Thing}]
});
TreeNodeCollection=Backbone.Collection.extend({model:TreeNode});
TreeView=Backbone.marionete.CompositeView.extend({
模板:“#节点模板”,
标记名:“ul”,
初始化:函数(){
this.collection=this.model.nodes;
},
appendHtml:函数(collectionView、itemView){
collectionView.$(“li:first”).append(itemView.el);
}
});
TreeRoot=Backbone.marionete.CollectionView.extend({itemView:TreeView});
Thing=Backbone.RelationalModel.extend();
Things=Backbone.Collection.extend({
模型:东西,
搜索:功能(opts){
返回新事物(this.where(opts));
}
});
Relationship=Backbone.RelationalModel.extend({
关系:[
{type:Backbone.HasOne,key's',relatedModel:Thing},
{type:Backbone.HasOne,键:'p',relatedModel:Thing},
{type:Backbone.HasOne,键:'o',relatedModel:Thing}
]
});
关系=主干.Collection.extend({
模式:关系,
搜索:功能(opts){
返回新关系(this.where(opts));
}
});
事物=新事物([
新事物({label:'Sam',language:'en',id:'A',datatype:'text'}),
新事物({label:'Fred',language:'en',id:'D',datatype:'number'}),
新事物({label:'Jake',language:'en',id:'E',datatype:'text'}),
新事物({label:'Sally',language:'en',id:'F',datatype:'number'}),
新事物({label:'is friends with',language:'en',id:'B',datatype:'text'}),
新事物({label:'is working with',language:'en',id:'G',datatype:'text'}),
新事物({label:'Violet',language:'en',id:'C',datatype:'text'})
]);
关系=新关系([
新关系({s:“A”,p:“B”,o:“C”}),
新关系({s:“A”,p:“B”,o:“D”}),
新关系({s:“A”,p:“B”,o:“E”}),
新关系({s:“A”,p:“B”,o:“F”}),
新关系({s:“D”,p:“B”,o:“C”}),
新关系({s:“D”,p:“B”,o:“F”}),
新关系({s:“A”,p:“G”,o:“F”}),
新关系({s:“D”,p:“G”,o:“A”})
]);
MainApp.start({things:things,relationships:relationships});
函数arrUnique(字段,arr){
var all=[];
每个(功能(项目)对应{
all.push(item.get(field.get('id'));
});
返回uq.uniq(全部);
}
功能图(arr、obj){
var graphNew=[];
var uniqueSubjects=arrUnique(“s”,arr.search({s:obj}));
对于(var i=0;i