2015-05-06 82 views
0

我正在嘗試創建一個角度工廠,這是基於來自複數網站課程http://www.pluralsight.com/training/player?author=shawn-wildermuth&name=site-building-m7&mode=live&clip=3&course=site-building-bootstrap-angularjs-ef-azure的一個示例。角度工廠不傳遞數據返回

從調試Chrome中的代碼,它似乎運行良好。我可以看到當我調試服務獲取我的數據並將其放入數組中時,但是當我查看$ scope.data或dataService.data中的控制器時,數組爲空。我沒有看到任何javascript錯誤。我不確定我做錯了什麼,有什麼建議。我正在使用AngularJS v1.3.15。

module.factory("dataService", function($http,$routeParams,$q) { 
var _data = []; 

var _getData = function() { 
    var deferred = $q.defer(); 

    $http.get("/api/v1/myAPI?mainType=" + $routeParams.mainType + "&subType=" + $routeParams.subType) 
     .then(function (result) { 
      angular.copy(result.data,_data); 
      deferred.resolve(); 
     }, 
     function() { 
      //Error 
      deferred.reject(); 
     }); 
    return deferred.promise; 
}; 

return { 
    data: _data, 
    getData: _getData 
};}); 

module.controller('dataController', ['$scope', '$http', '$routeParams', 'dataService',function ($scope, $http, $routeParams, dataService) { 
$scope.data = dataService; 
$scope.dataReturned = true; 
$scope.isBusy = true; 

dataService.getData().then(function() { 
    if (dataService.data == 0) 
     $scope.dataReturned = false; 
}, 
function() { 
    //Error 
    alert("could not load data"); 
}) 
.then(function() { 
    $scope.isBusy = false; 
})}]); 

回答

0

return { 
    data: _data, 
    getData: _getData 
};}); 

你有 「數據:_data」,而你的陣列被命名爲只是 「數據」。更改變量匹配的名字,它會工作:

var _data = []; 
0

事實上,在你的代碼的一些錯誤:

  • 在你的服務,你定義var data = [];,但你回來​​。所以,你應該糾正認定中,以var _data = []
  • 你不定義_bling,但是你用angular.copy(result.data,_bling);

還有一個問題,爲什麼你assigne的服務$scope.data$scope.data = dataService

編輯: 注意到有3個變化如下代碼:

  1. 註釋$scope.data = dataService;,因爲它沒有任何意義,我認爲$scope.data應該是數據服務收益。
  2. $scope.data = dataService.data;,正如我在第一點所述。你可以看到控制檯的結果。
  3. 在if條件中,我認爲你想比較返回的數據數組的長度,但不是數據。

    module.controller('dataController', ['$scope', '$http', '$routeParams', 'dataService',function ($scope, $http, $routeParams, dataService) { 
    // $scope.data = dataService; 
    $scope.dataReturned = true; 
    $scope.isBusy = true; 
    
    dataService.getData().then(function() { 
        if (dataService.data.length === 0){ 
         $scope.dataReturned = false; 
        }else{ 
         $scope.data = dataService.data; 
         console.log($scope.data); 
        } 
    }, 
    // other codes... 
    })}]); 
    
+0

比較遺憾的是,當我把這裏的代碼創建了這些錯誤。不知道這是怎麼回事,我第一次問堆棧溢出。我已修復上面的帖子,但仍然有同樣的問題。 至於我爲什麼要這樣做。那麼我就是這樣做的例子。對我來說似乎很奇怪。他說了一些關於它能夠檢測數據服務的變化。整個想法是,我可以在這裏存儲數據的共享副本,並減少往返服務器的次數。不知道我真的很喜歡它是誠實的,我沒有這項服務找到了所有這些工作。 –

+0

@AndrewCrowder我修改了我的答案給你一些代碼。它應該工作。你可以嘗試嗎? – Qianyue

+0

謝謝我使用類似於你的代碼來完成它的工作,但它似乎是間歇性的,它會工作一段時間,然後停下來,當我對java腳本做了一些非常小的調整。 因爲在我剛剛回去之前,我有一個非工廠版本的工作。我知道答案的信用在這裏是一件大事,不知道做了什麼,因爲我是放棄解決方案的人而不是你。我真的很感激你的時間和你提供的幫助。 –

0

爲什麼你會使用來自$ Q這樣推遲?

使用$ Q的正確方法:

$http.get("/api/v1/myAPI?mainType=" + $routeParams.mainType + "&subType=" + $routeParams.subType) 
    .success(function (result) { 
     deferred.resolve(result); 
    }).error(
    function() { 
     //Error 
     deferred.reject(); 
    }); 

然後在控制器

dataService 
    .getData() 
    .then(function success(result) { 
     $scope.data = result; //assing retrived data to scope variable 
    }, 
    function error() { 
     //Error 
     alert("could not load data"); 
    }); 
+0

所以,當我嘗試這樣我得到的。然後語句錯誤 類型錯誤:在新

+0

@AndrewCrowder無法讀取屬性「然後」未定義 的你仍然有「deferred.promise返回;」在_getData函數中行嗎?仍然有義務從那裏退還承諾。 –

+0

謝謝,我想我把它拿出來,不再認爲它是需要的。不過,我認爲我會放棄這種整體方法,因爲我顯然不明白這一點。我得到它的工作,但後來我做了一些調整,看似無關的JavaScript並停止工作。 因爲在我剛剛回去之前,我有一個非工廠版本的工作。 我知道答案的信用在這裏是一件大事,不知道做什麼,因爲我是放棄解決方案的人而不是你。我真的很感激你的時間和你提供的幫助。 –