2016-05-16 173 views
0

我正在使用ngStorage(localStorage)處理這個新的AngularJS項目,但不太清楚爲什麼我會收到下面的消息。每當我點擊我的添加按鈕時,我會得到這個。TypeError:無法讀取未定義AngularJS的屬性'unshift'

TypeError: Cannot read property 'unshift' of undefined AngularJS 

以下是我的代碼。有人可以解釋爲什麼這個錯誤發生?

.factory ('StorageService', function($localStorage) { 

$localStorage = $localStorage.$default({ 
    favorites: [] 
}); 

var _getAll = function() { 
    return $localStorage.favorites; 
}; 

var _add = function (color) { 
    $localStorage.favorites.unshift(color); 
} 
var _remove = function (color) { 
    $localStorage.favorites.splice(index, 1); 
} 
return { 
    getAll: _getAll, 
    add: _add, 
    remove: _remove 
    }; 
}) 

控制器

.controller('HomeCtrl', function($scope, $localStorage, dataService, StorageService) { 

    $scope.add = function (color) { 
     StorageService.add(StorageService.favorites.unshift(dataService.colors.indexOf(color))); 
     console.log(color); 
     }; 
)}; 
+1

StorageService沒有名爲favorites的屬性..將它添加到返回對象。 –

+0

這是因爲localStorage.favorites不存在。 –

+1

StorageService僅公開什麼返回(GETALL,添加,刪除) – sam1188

回答

0

您可以訪問收藏夾陣列像這樣(使用已經暴露GETALL功能):

StorageService.add(StorageService.getAll.unshift(dataService.colors.indexOf(color))); 
1

究竟是什麼你要完成的任務與您的控制器中的線路連接:

StorageService.add(StorageService.favorites.unshift(dataService.colors.indexOf(color)));

我假設你想調用你的服務的add方法,並將它的值color傳遞給dataService

正如其他答案中提到的,您的錯誤來自favorites未在服務的返回塊中定義。但是如果你確定了它,你仍然不會添加顏色,因爲unshift將返回新的長度StorageService.favorites

如果我asumption是正確的,你可能會想要做的事,如:

StorageService.add(dataService.colors.indexOf(color));

如果您確實需要「獲取」從你的服務的最愛,不要發佈打破你的封裝$localStorage.favorites,但使用你的getAll方法來獲得「收藏夾」。

P.S.另外不要忘記檢查dataService實際上是否有一個顏色鍵,或者你有另一個潛在的空指針。

+0

使用該行代碼我希望用戶能夠將顏色添加到「收藏夾」。你是正確的我將它傳遞給dataService中的顏色值(所有顏色都是這樣)。 – JBlaze321

+0

我很困惑我現在該如何使用getAll – JBlaze321

+0

你不需要在你的add方法中使用getAll。就像我描述的那樣調用它。它應該工作。關於getAll的評論我的意思是說,您不需要按照您的問題的評論中的建議向您的服務添加收藏夾 –