用来自Neo4j服务器的JSON数据在Angular中创建一个工厂

Creating a factory in Angular with JSON data from Neo4j server

本文关键字:创建 工厂 一个 Angular Neo4j 服务器 数据 JSON      更新时间:2023-09-26

我一直在用Neo4j学习Angular,我遇到了处理JSON的问题,我得到了对我的查询的响应。

现在,我想要捕获数据,并能够在不同的应用程序视图之间使用它(即点击选择的汽车,去查看那辆车),所以为了做到这一点,我想我需要设置一个工厂处理所有的数据。现在,我有这个。

我对Neo的调用,我猜它也应该在Factory而不是controller中。

function restcall($scope, $http) {
  var call = '{ "statements" : [ { "statement" : "MATCH (n:Cars) RETURN n ORDER BY n.initRank DESC LIMIT 10" } ] }';
  $http({
                method: 'POST',
                url: 'http://myserver:7474/db/data/transaction/commit',
                data: call,
                headers: { 'Content-Type': 'application/json',   
                           'Authorization': 'Basic mybasekey' } 
 })
 .success(function (data, status) {
                        $scope.status = status;
                        $scope.response = data.results;
            })
            })
        };

这,工作在个别情况下,但更重要的是我的问题是JSON,我收到作为响应我的调用。它看起来像这样

{
"results":[{
    "columns":[
        "n"
    ],
    "data":[
        {"row":[{"name":"Car1","initRank":"..."}]},
        {"row":[{"name":"Car2","initRank":"..."}]},
        {"row":[{"name":"Car3","initRank":"..."}]},
        {"row":[{"name":"Car4","initRank":"..."}]},
        {"row":[{"name":"Car5","initRank":"..."}]},
        {"row":[{"name":"Car6","initRank":"..."}]}]
}],
"errors":[]
}

现在,因为我只使用json中的行,我想设置一个变量,比如cars,它的形状是

 var Cars = [{
        id: 0,
        name: 'Car1',
        initRank: '...'
      }, {
        id: 1,
        name: 'Car2',
        initRank: '...'
      }, {
        id: 2,
        name: 'Car3',
        initRank: '...'
      }, {
        
        // And so on until end of the result in rows
        
      }];

现在,为了做到这一点,我尝试使用FOR循环并将结果添加到单个数组成员中,如

car[i].name = response.data[i].row[0].name

但是没有成功。

所以最终我的问题是。

1。我的工厂应该是什么样子?

这样可以吗?

.factory('Cars', function($scope, $http){
    //rest of my rest call from function
} )

我已经看到使用$http.get()的例子,但我不知道如何传递我现在在我的http(方法需要为db的缘故,我的密码调用,授权层…),使用http.get()的所有东西。

2。如何格式化我的响应,以便有一个很好的var Cars ?

还有一件事困扰着我…

  • 是否有可能在不经过ng-repeat的情况下从工厂传递特定行?如果我只想访问一个case的Car3。
  • 如果不是,像我假设的那样,如何,如果我正在阅读Car3与response.data[2].row[0].name 如何将其传递给新视图?

    1. 我的工厂应该是什么样子?
    • 你的工厂应该返回一个对象,它定义了你的getCars()方法。getCars()应该返回一个promise。
    • 不要将$scope传递给services。$scope是连接视图和控制器的粘合剂。

      .factory('Cars', function($http){
         // return an object.
         return {
            getCars: getCars
         }
      
         function getCars(){   
                return  $http.get('http://myserver:7474/db/data/transaction/commit', {params:{"param1": val1, "param2": val2}}).then(function(response){
                   return response.data.results.data.map(function(d){ 
                      return d.row[0];
                   });
                })
         }
      })
      
  • 如何格式化我的响应,以便有一个很好的var Cars ?
  • 你可以使用承诺链接,当第一个承诺(来自服务器的响应)被解析后,在数据格式化(做出适当的cars)之后返回第二个承诺。

    如何?

    已经包含在getCars定义中。

    是否有可能从工厂传递特定行而不经过ng-repeat吗?如果我想只访问一个case的Car3

    是的。只需将从服务器返回的汽车存储在工厂的局部变量中。并且,定义一个getCar(carId)方法,它将首先在这个变量中查找,如果发现它将解析一个承诺(使用$q),否则,它将调用getCars()从服务器获取数据。然后,通过获取car的局部变量来解析承诺。