【问题标题】:TypeError: Cannot read property 'unshift' of undefined AngularJSTypeError:无法读取未定义 AngularJS 的属性“unshift”
【发布时间】:2016-09-12 17:50:53
【问题描述】:

我正在使用 ngStorage (localStorage) 开发这个新的 AngularJS 项目,但不太清楚为什么我会收到以下消息。每当我点击我的添加按钮时,我都会得到这个。

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);
      };
)};

【问题讨论】:

  • StorageService 没有名为收藏夹的属性。将其添加到返回对象中。
  • 这是因为 localStorage.favorites 不存在。
  • StorageService 只公开返回的内容(getAll、add、remove)
  • 那么会是这样的吗:return { getAll: _getAll, add: _add, remove: _remove, StorageService: $localStorage.favorites };

标签: javascript angularjs local-storage ng-storage


【解决方案1】:

你到底想用控制器中的行来完成什么:

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

我假设您想调用服务的add 方法并将color 的值传递给dataService

正如其他答案中提到的,您的错误来自 favorites 未在您的服务的返回块中定义。但是如果你定义了它,你仍然不会添加颜色,因为unshift 将返回StorageService.favorites 的新长度。

如果我的假设是正确的,您可能会想要执行以下操作:

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

如果您确实需要从您的服务中“获取”收藏夹,请不要通过发布 $localStorage.favorites 来破坏您的封装,而是使用您的 getAll 方法来获取“收藏夹”。

附:另外不要忘记检查 dataService 是否真的有一个颜色键或者你有另一个潜在的空指针。

【讨论】:

  • 使用那行代码,我希望用户能够为“收藏夹”添加颜色。你是对的,我将 dataService 中的颜色值(所有颜色都在其中)传递给它。
  • 我现在对如何使用 getAll 感到困惑
  • 您不需要在 add 方法中使用 getAll 。就像我描述的那样称呼它。它应该工作。我对 getAll 的评论的意思是,您不需要按照 cmets 对您的问题的建议将收藏夹添加到您的服务中
  • 感谢您的建议!我能够通过使用 getAll 方法获取收藏夹来解决我的问题。我非常感谢您的帮助
【解决方案2】:

您可以像这样访问收藏夹数组(使用已经公开的 getAll 函数):

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

【讨论】:

    猜你喜欢
    • 2015-08-26
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2014-12-24
    • 2015-03-28
    • 2019-04-22
    • 2016-05-06
    相关资源
    最近更新 更多