AngularJS无法从对象中获取信息

时间:2014-01-25 11:04:51

标签: angularjs

我正在努力解决以下问题:

我从我的后端服务获得json响应,该服务是从我的services.js调用的。 详细地: (这是许多尝试的最后一次......)

'use strict';

/* Services */

var testServices = angular.module('testServices', ['ngResource']);

var eventtracker = {};

...

testServices.factory('TestSvc',
function($rootScope, $http, $timeout) {

  initTest: function(){
      var dataresponse = {};
      dataresponse.events = new Array();
      dataresponse.currentuser = "";
      dataresponse.error = "";

  eventtracker.lasteventindex = 0;

  $http.get('rest/testservice/test/events/0').then(function(r) {
         if (r.data.error === null){
     eventtracker.lasteventindex = r.data.events.length; // == save last event index

     ....
     //doing a lot of stuff here to collect all data to dataresponse object
     ....
     //for example:
         for (var i=0;i<parseInt(eventtracker.lasteventindex);i++)
     {
        for (sKey in r.data.events[i])
           {
            //scan for controller
            if (sKey==="controller"){
            if (i===parseInt(eventtracker.lasteventindex) - 1){
                   //get current user
               dataresponse.currentuser = r.data.events[i][sKey];
                }
            c++;
            dataresponse.events[c] = new Object();
            dataresponse.events[c]["controller"] = r.data.events[i][sKey];
            dataresponse.events[c]["column"] = r.data.events[i][sKey];
            }   
     }
     }

     ....
     //and so on...
  }
  }
  //after all of that, datresponse object will be returned
  return dataresponse; 
  }
 };
}
);

到目前为止一直很好......

现在,当我将对象传递给$ scope.data并执行{{data | json}}一切正常! (Json有效且输出正确!)。

但是,如果我想从对象中获取一些特定信息(从我的控制器,将其传递给正确的$ scope,它就不起作用。) 详细说明:

转到controllers.js:

testControllers.controller('TestCtrl', ['$scope', 'TestSvc',   '$routeParams', '$log', 
function($scope, TestSvc, $routeParams, $log) {
    $scope.data = TestSvc.initTest(); //this is working!!
}
]);

$ scope.data({{data | json}})的输出:

{
 "events": [
  {
    "controller": "TESTUSER",
    "column": 1
  },
  {
    "controller": "TESTUSER",
    "column": 2
  },
  {
    "controller": "TESTUSER",
    "column": 3
  },
  {
    "controller": "TESTUSER",
    "column": 0
  }
],
"currentuser": "TESTUSER",
"error": ""
}

我可以在模板端获取此对象的所有信息,如:     Test1:{{data.events [0] .controller | json}}

结果是:TESTUSER - &gt; PERFECT!

但正如我所说,如果我想从控制器端的对象中获取任何详细信息 - 我无法做到。

例如: 通过在控制器功能中执行此操作:

 $scope.test = $scope.data.currentuser;

结果:视图级别没有任何内容(没有错误,只是没有)

模板:     {{测试}}

控制器:

$scope.test = $scope.data.events[0].controller;

结果:在视图方面,现在角度完全停止工作 - 但同样没有错误。 在这种情况下,视图侧的结果是{{test}},现在还没有解析其他所有内容。

只有将完整的对象传递给$ scope.test才能正常工作:

$scope.test = $scope.data //-> works! (output is json like above)

我还试图获得有关控制器端对象的更多信息,例如:

$scope.data.events.length

它返回0 - &gt;总是0 ......

我真的不明白......

当然,我尝试了很多尝试:

$scope.test = $scope.data.events[0]["controller"]; -> angular "stops" working
$scope.test = $scope.data[0]; -> nothing happens
$scope.test = $scope.data[0]["currentuser"]; -> angular "stops" working

and and .... -

为什么这不适用于控制器端,但是它在视图端和服务端工作?!?!

我只能解析扔掉控制器的整个对象,但是我无法从中获取任何信息.... 我确信我刚刚监督了一些事情 - 不幸的是我不知道是什么......

非常感谢你们和kr, 马丁

1 个答案:

答案 0 :(得分:1)

当您为服务TestSvc拨打数据时,该服务将返回$http电话的结果。但是,此代码是异步的。 $http调用在服务器调用完成时调用回调(即.then(function(r) {})。

因此,当您返回时,您的服务调用响应仍为空。

更好的做法是从服务中返回承诺:

return $http.get('rest/testservice/test/events/0');

然后在控制器中处理承诺:

TestSvc.initTest().then(function(data) { ... });

承诺可以链接。因此,如果需要,您可以保留服务中的所有逻辑,但是您需要返回服务中逻辑结果的另一个承诺。

More about promises and $q here in the docs.