使用Neo4j服务器中的JSON数据在Angular中创建工厂

时间:2015-09-18 23:59:40

标签: javascript json angularjs rest factory

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

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

我打电话给Neo,我猜也应该是在Factory而不是控制器。

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的行,我想设置一个变量,比如汽车,它将具有这种形状

 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

还有一件事让我烦恼......

  1. 是否可以在不经过ng-repeat的情况下从工厂传递特定行?如果我想只为一个案例访问Car3。
  2. 如果不是,就像我假设的那样,如果我用response.data[2].row[0].name 读取Car3如何将其传递给新视图?

1 个答案:

答案 0 :(得分:1)

  
      
  1. 我的工厂应该怎么样?
  2.   
  • 您的工厂应该返回一个定义getCars()方法的对象。
  • getCars()应该返回一个承诺。
  • 请勿将$ scope传递给服务。 $ 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];
                 });
              })
       }
    })
    
  
      
  1. 如何格式化我的回复以获得一个不错的var汽车?
  2.   

你可以使用,承诺链接,在数据格式化(制作合适的汽车)后,当第一个(服务器响应)得到解决时,返回第二个承诺。

如何?

已在getCars定义中包含此内容。

  

是否可以在不经过的情况下从工厂传递特定行   NG-重复?如果我想只为一个案例访问Car3。

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