【问题标题】:Ionic application error: array.push() is not a function离子应用程序错误:array.push() 不是函数
【发布时间】:2017-04-17 21:26:51
【问题描述】:

我创建了一个应用程序,其中有控制器和工厂。我在工厂内部有一个数组,我想将元素的 id 推送到这个数组。但是,当我尝试将元素推送到数组时,出现了一个错误,即

“favorites.push 不是函数”

您可以在下面找到我的控制器和工厂。感谢您阅读: 工厂:

.factory('favoriteFactory',['$resource', 'baseURL','$localStorage', function ($resource, baseURL, $localStorage) {
            var favFac = {};
            var favorites = $localStorage.get('favorites', []);
          favFac.addFavorites = function (index) {
            for(var i=0; i<favorites.length; i++){
              if(favorites[i].id == index)
                return
            }
              favorites.push({id: index});
              $localStorage.storeObject('favorites',favorites)
          }
          favFac.deleteFromFavorites = function (index) {
            for (var i = 0; i < favorites.length; i++) {
              if (favorites[i].id == index) {
                favorites.splice(i, 1);
              }
            }
            $localStorage.storeObject('favorites', favorites)
          };

          favFac.getFavorites = function () {
            return $localStorage.getObject('favorites',[]);
          };
          return favFac
        }])

控制器:

    .controller('MenuController', ['$scope', 'menuFactory', 'favoriteFactory','baseURL', '$ionicListDelegate', 'dishes', '$localStorage',
         function($scope, menuFactory,favoriteFactory, baseURL, $ionicListDelegate, dishes, $localStorage) {


        $scope.baseURL = baseURL;
        $scope.tab = 1;
        $scope.filtText = '';
        $scope.showDetails = false;
        $scope.showMenu = true;
        $scope.message = "Loading ...";
        $scope.addFavorite = function (index) {
          console.log("index:" +index);
          favoriteFactory.addFavorites(index);
          $ionicListDelegate.closeOptionButtons();

        };
        $scope.dishes = dishes;

            $scope.select = function(setTab) {
              $scope.tab = setTab;

              if (setTab === 2) {
                $scope.filtText = "appetizer";
              }
              else if (setTab === 3) {
                $scope.filtText = "mains";
              }
              else if (setTab === 4) {
                $scope.filtText = "dessert";
              }
              else {
                $scope.filtText = "";
              }
                };
   $scope.isSelected = function (checkTab) {
      return ($scope.tab === checkTab);
    };

    $scope.toggleDetails = function() {
      $scope.showDetails = !$scope.showDetails;
    };
  }])

【问题讨论】:

    标签: javascript angularjs arrays ionic-framework


    【解决方案1】:

    我假设您使用的是ngStorage。 get 方法没有第二个参数。因此,您尝试返回默认值 [](空数组) 只是返回 undefined,然后您尝试推送到 undefined 而不是数组。

    ngStorage 的源代码没有显示get 的第二个参数: https://github.com/gsklee/ngStorage/blob/master/ngStorage.js

    所以这一行:

    var favorites = $localStorage.get('favorites', []);
    

    应该是这样的:

    var favorites = $localStorage.get('favorites') || [];
    

    【讨论】:

    • 感谢您的回复,默认情况下可以带两个参数。第二个是您可以提供的默认值。问题是我正在改变什么,我得到了同样的错误。即使我正在创建简单的数组。
    • 这是我的代码的第二部分,我在其中创建了相同的东西 get: function (key,defaultValue) { return $window.localStorage[key] ||默认值; },
    • 我知道我在谈论我刚刚分享的我自己的功能。它正在做同样的事情,我发送到该默认值。 var 收藏夹 = $localStorage.get('收藏夹') || [];
    • 也许您已经在本地存储中存储了一个与您的键匹配的值,而不是数组。
    • 还有,getgetObject有什么区别?
    猜你喜欢
    • 2017-12-02
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    相关资源
    最近更新 更多