2016-05-16 37 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的评论我的意思是说,您不需要按照您的问题的评论中的建议向您的服务添加收藏夹 –

相关问题