【问题标题】:Creating a factory in Angular with JSON data from Neo4j server使用来自 Neo4j 服务器的 JSON 数据在 Angular 中创建工厂
【发布时间】:2015-09-18 23:59:39
【问题描述】:

我一直在使用 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 中拥有的所有东西(为了数据库,我的密码调用,授权层需要发布该方法..),使用 http.get()。

2。如何格式化我的回复以便有一个好的var Cars

还有一件事困扰着我……

  1. 是否可以在不通过 ng-repeat 的情况下从工厂传递特定行?如果我只想访问 Car3 的案例。

如果不是,就像我想的那样,如果我正在使用 response.data[2].row[0].name 阅读 Car3,如何如何将其传递给新视图?

【问题讨论】:

    标签: javascript json angularjs rest factory


    【解决方案1】:
    1. 我的工厂应该是什么样子?
    • 您的工厂应返回一个对象,该对象定义您的 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 Cars ?

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

    如何?

    已经在 getCars 定义中包含了这个。

    是否可以从工厂传递特定行而不经过 重复?如果我只想访问 Car3 的案例。

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

    【讨论】:

    • 感谢您非常详尽的回答,我编辑了问题 1,因为我还有一个问题,我必须将数据传递到服务器,其中还包含授权层以及密码查询..而且我不知道如何在 http.get() 中传递它,所以如果你能在这里帮助我,我将不胜感激。
    • 更新了我的代码,您可以将参数传递给 $http.get() 作为第二个参数。请看配置。角度文档中的对象docs.angularjs.org/api/ng/service/$http
    猜你喜欢
    • 2016-01-20
    • 2016-07-04
    • 1970-01-01
    • 2021-03-08
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多