如何将 angular 中的单个 json 数据 "values" 绑定到命名的 $scope 变量(使用 SPARQL 查询返回的数据)?

How to bind individual json data "values" in angular to named $scope variables (data returned using SPARQL query)?

Newby Angular 如果问题很愚蠢,我深表歉意。检查了其他关于数据多样性、堆栈溢出、google ... 检查了 w3c 并尝试了几次 "try it and see solutions" 但就是无法让它发挥作用。

基本上,我使用 angular 绑定 classes 上的 SPARQL 查询结果和 dataset/query 中 classes 的数量 使用 Fuseki Server 1-1.1.2 端点 (SPARQL 1.1)。 (请参阅下面的问题后的代码)。

这很好地列出了 URI 格式的 class 名称和 URI 格式的实例计数,但我只想在结果中看到 "class" 的“#”之后的字符比整个 URI。

我最初尝试在查询中使用 REPLACE 和 STRAFTER 函数在 SPARQL 查询中执行此操作(即 SELECT (strafter(str(?class),"#") AS ?className)) 直接在 Fuseki 中工作正常,但 returns 空白导致尝试 angular 绑定。

通过阅读其他答案,我知道 getLocalName() 并且并非所有数据在“#”之后都有本地名称,但我需要访问 [=51= 中“#”之后的部分].所以我的问题是这个....

为了对返回的数据执行 URI/string 操作,我想知道如何将返回的单个数据项绑定到单个范围变量,即而不是 $scope.results = response.results.bindings 我可以做类似 $scope.results.class = response.results.bindings.class.value 的事情吗? (当我尝试它时它不起作用,也没有将 "results.bindings.class.value" 传递给字符串描述函数,因为我不知道如何在 ng-repeat 中调用它)。

总而言之,你能告诉我如何将个人 json "values" 绑定到命名的 $scope 变量吗?

感谢收到的任何帮助。我必须使用 SPARQL 来完成,javascript/HTML/angular.

这是我的代码。

<!DOCTYPE html>
<html >
<script src=     "http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
<body>

<div ng-app="myApp" ng-controller="queryCtrl"><table>
 <tr ng-repeat="x in results">
    <td>{{x.class.value}}</td>
    <td>{{x.count.value}}</td>
  </tr>
</table></div>

<script>
var app = angular.module('myApp', []);
app.controller('queryCtrl', function($scope, $http) {
   var query = encodeURIComponent("SELECT  ?class (COUNT(?s) AS ?count ) { ?    s a ?class } GROUP BY ?class ORDER BY ?count");
   var endpoint = "http://localhost:3030/dataset/query";
   $scope.results = [];
   $http.get("http://localhost:3030/dataset/query?    query="+query+"&output=json")
   .success(function (response) {
    $scope.results = response.results.bindings;
    /* for debugging*/
    if ( window.console && window.console.log ) {
       // console is available, write message if something has happened
       console.log(response.results);
    }
   });

});
</script>

</body>
</html>

如果我对你的问题的理解正确,你想绑定到 json 数据,但只在 class 值的视图中显示 # 之后的子字符串。这可以通过在 x.class.value 上应用过滤器来完成。那么您可以这样做:

假设您的数据return采用以下形式:

{"results": {"bindings": [
  {"class": {"value": "http://foo.bar#foo"}, "count": {"value": 123}}
  ]
}}

检索 json 文件并使用 return 值填充范围变量:

app.controller('queryCtrl', function($scope, $http) {
  $scope.results = [];
  $http.get("results.json")
    .then(function (response) {
      $scope.results = response.data.results.bindings;
    });
});

在视图中应用过滤器:

<td>{{x.class.value | myFilter}}</td>

定义过滤器以提取 #:

之后的子字符串
app.filter('myFilter', function() {
  return function(name) {
    var n = name.indexOf('#');// or lastIndexOf
    return name.substring(n + 1);
  }
});

这是一个有效的 plunker

p.s。您可以将示例中的所有查询逻辑移动到可重复使用的 service/factory,这将使您的应用程序更干净。

为此花了一天时间,一个解决方案是将 class URI 表示形式转换为 SPARQL 查询中的字符串,并在 ng-repeat 中使用自定义 angular 过滤器。

所以不用

  <tr ng-repeat="x in results">
    <td>{{ x.class.value}}</td>
    <td>{{ x.count.value }}</td>
  </tr>

我有

  <tr ng-repeat="x in results">
    <!--<td>{{ x }}</td>-->
    <td>{{ x.className.value | localClassName}}</td>
    <td>{{ x.count.value }}</td>
  </tr>

而不是

SELECT ?class (COUNT(?s) AS ?count) {?s a ?class} GROUP BY ?class ORDER BY     DESC(?count)

我有

SELECT (str(?class) AS ?className) (COUNT(?s) AS ?count) {?s a ?class} GROUP     BY ?class ORDER BY DESC(?count)

并附加到 angular.module.controller 的是新过滤器 "localClassName"

.filter("localClassName", function(){
        return function(value){
            /*var startName = value.indexOf("#") + 1;*/
            return String(value).slice(value.indexOf("#") + 1);
        }
   })

整个代码现在是这样的:

<!DOCTYPE html>
<html>
<script src=         "http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
<body>

<div ng-app="myApp" ng-controller="queryCtrl">

<table>
  <tr ng-repeat="x in results">
    <td>{{ x.className.value | localClassName}}</td>
    <td>{{ x.count.value }}</td>
  </tr>
</table>

</div>

<script>
var app = angular.module('myApp', []);
app.controller('queryCtrl', function($scope, $http) {
   var query = encodeURIComponent("SELECT (str(?class) AS ?className)     (COUNT(?s) AS ?count) {?s a ?class} GROUP BY ?class ORDER BY DESC(?count)");
   var endpoint = "http://localhost:3030/dataset/query";
   $http.get("http://localhost:3030/dataset/query?    query="+query+"&output=json&stylesheet=")
   .success(function (response) {
    $scope.results = response.results.bindings;
    /* for debugging*/
    if ( window.console && window.console.log ) {
       // console is available, write message if something has happened
       console.log(response.results);
    }

   })
}).
   filter("localClassName", function(){
        return function(value){
            /*var startName = value.indexOf("#") + 1;*/
            return String(value).slice(value.indexOf("#") + 1);
        }
   })

</script>

</body>
</html>

而且效果很好!