我正在努力解决以下问题:
我从我的后端服务获得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, 马丁
答案 0 :(得分:1)
当您为服务TestSvc
拨打数据时,该服务将返回$http
电话的结果。但是,此代码是异步的。 $http
调用在服务器调用完成时调用回调(即.then(function(r) {}
)。
因此,当您返回时,您的服务调用响应仍为空。
更好的做法是从服务中返回承诺:
return $http.get('rest/testservice/test/events/0');
然后在控制器中处理承诺:
TestSvc.initTest().then(function(data) { ... });
承诺可以链接。因此,如果需要,您可以保留服务中的所有逻辑,但是您需要返回服务中逻辑结果的另一个承诺。