我想创建AngularJS指令,以便能够在不创建自定义json映射的情况下操作RDF图。
关于RDF数据结构的一些基本信息。
描述两个人的RDF图的例子:
Graph G1 =
(Sebastien,familyName,Lorber)
(Sebastien,phoneNumber,046456654)
(Sebastien,email,seb@gmail.com)
(Henry,familyName,Story)
(Henry,phoneNumber,046456654)
(Henry,email,henry@gmail.com)
所以我可以创建一个指向这个图的指针:
PointedGraph PG =(Sebastien,G1)
就像是在包含2个节点的图形节点Sebastien上:Henry和Sebastien
返回Angular
我想做的是能够在我的视图中直接映射此图形数据(由库处理)。
在伪代码中它应该有点像这样:
<div ng-model="PG">
<span ng-model="PG.pointedSubject"/>
<span rdf-predicate="familyName"></span>
<input rdf-predicate="phoneNumber"/>
<input rdf-predicate="email"/>
</div>
我是Angular的新手,我不知道该怎么做,也没有找到任何类似的例子。我只知道我可能应该在我的rdf-predicate
指令中使用^ ngModel控制器。
我有一个API,其中包含操作图形数据的功能,我可以执行以下操作:
getPredicateValue(pointedGraph,predicate);
getPredicateValue(graph,subject,predicate);
changePredicateValue(pointedGraph,predicate,newObjectValue);
changePredicateValue(graph,subject,predicate,newObjectValue);
在此图形对象上与Angular进行双向绑定可能就足够了。
有人可以告诉我实现这个目标的最佳途径吗?
效果考虑因素
如果我代表一个人的模型不是一个JSON对象而是一个尖头图,如果我在这个尖头图上放一个监视器,它会减慢脏检查机制吗?
答案 0 :(得分:0)
最后我找到了解决方案。
可以这样使用:
<div style="clear:both;">
<h2>Mode edition:</h2>
<div style="clear:both;">
Name: <input ng-model="personPG" rdf-predicate-binding="foaf:name"></input><br/>
Given name: <input ng-model="personPG" rdf-predicate-binding="foaf:givenName"></input><br/>
Family name: <input ng-model="personPG" rdf-predicate-binding="foaf:familyName"></input><br/>
Img: <input ng-model="personPG" rdf-predicate-binding="foaf:img"></input><br/>
Nick: <input ng-model="personPG" rdf-predicate-binding="foaf:nick"></input><br/>
Mbox: <input ng-model="personPG" rdf-predicate-binding="foaf:mbox"></input><br/>
Homepage: <input ng-model="personPG" rdf-predicate-binding="foaf:homepage"></input><br/>
</div>
</div>
指令是:
.directive('rdfPredicateBinding',['RdfGraphService',function(RdfGraphService) {
return {
restrict: 'A',
require: 'ngModel',
scope: {
ngModel: '=',
rdfPredicateBinding: '@rdfPredicateBinding'
},
link: function(scope, elm, attrs, ngModelCtrl) {
var predicate = scope.rdfPredicateBinding;
ngModelCtrl.$formatters.push(function formatter(pointedGraph) {
if (pointedGraph) {
var object = RdfGraphService.findFirstObject(pointedGraph.graph,pointedGraph.pointer,predicate);
return object;
}
});
ngModelCtrl.$parsers.push(function parser(value) {
var pg = scope.ngModel;
var newGraph = RdfGraphService.createOrReplaceObject(pg.graph,pg.pointer,predicate,value);
return {
graph: newGraph,
pointer: pg.pointer
}
});
// model -> view
ngModelCtrl.$render = function() {
elm.val(ngModelCtrl.$viewValue);
};
}
};
}])
然而,我不确定这是一个理想的解决方案,我想知道它创造了多少手表。顺便说一句,PointedGraph可能是一个复杂的观察对象