创建映射到非json模型的自定义ng-model指令

时间:2014-01-02 17:59:39

标签: javascript angularjs angularjs-directive

我想创建AngularJS指令,以便能够在不创建自定义json映射的情况下操作RDF图。


关于RDF数据结构的一些基本信息。

  • RDF图是一组三元组Set(subject,谓词,宾语)。
  • 因此RDF图可以有多个主题(〜节点)
  • 尖头图是我们指向给定主题的图。 所以它是一个(pointedSubject,graph),其中pointedSubject是图的主题。

描述两个人的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对象而是一个尖头图,如果我在这个尖头图上放一个监视器,它会减慢脏检查机制吗?

1 个答案:

答案 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可能是一个复杂的观察对象