2014-01-25 27 views
0

我有以下問題所困擾的信息:AngularJS不能脫身對象

我碰到這是從我的services.js打電話給我的後端服務的JSON響應。 詳細: (這是最後很多嘗試的...)

'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有效並且輸出正確!)。

但是,如果我想獲得一些特定的信息出來的對象(從我的控制器,將它傳遞給正確的$範圍,它不工作)。 詳細:

去控制器。 JS:

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

輸出({{數據| JSON}}):

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

,我能得到的所有信息了這個對象的模板SI de: Test1:{{data.events [0] .controller | json}}

結果是:TESTUSER - > 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 - >始終爲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 

和和和....

這是爲什麼不工作的控制器的一面,但它正在查看側和服務側?!?!

我只是能夠解析整個對象扔控制器,但我無法得到任何信息...... 我敢肯定,我剛剛監督的東西 - 不幸的是我不'知道什麼...

非常感謝球員和KR, 馬丁

+1

你需要學會正確地制定一個問題。就像現在這樣,它太多的文字說得沒什麼。到點 – RedHotScalability

+0

恩,感謝您的建議RedHotScalability - 我會盡我所能下一次。 – user3234752

回答

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.

+0

謝謝Davin,那就是解決方案! – user3234752