angularjs重新初始化数组给了我" TypeError:无法读取属性' push'未定义"

时间:2017-08-09 02:16:32

标签: angularjs

我遇到了一个特殊的问题。

我在HTML中有下拉列表的视图:

<div ng-controller='ConfigurableInputController as configurableInput'>
       <select class="fixed-input"
             ng-model="configurableInput.selectedCriteria"
             ng-change="configurableInput.update()" 
             ng-options="criterion.selected as criterion.name for criterion in configurableInput.criteriaList">
            <option value="">--Please select the comparison criteria--</option>
      </select>

上面显示了下拉列表中的3个选项:商店,频道和权限。 当我将选项从商店更改为频道或权限或任何组合时,视图会更改(输入框,某些标签等)。

控制器中的我的update()方法执行此操作:

configurableInput.update = function () {
      configurableInput.permission = "";
      configurableInput.id1 = "";
      configurableInput.id2 = "";
      configurableInput.items1 = "";
      configurableInput.items2 = "";
      configurableInput.defaultValueArray = [];
      configurableInput.permissionsArr = [];
}

在选择下拉项目时,我点击了一个从Db中检索信息的按钮。

有两种方法可以在ng-click上调用,但是给我带来麻烦的方法就是这个方法在服务方法中:

StoreConfigurableService.$inject = ['$q', '$http', 'ApiBasePath'];
function ConfigurableService($q, $http, ApiBasePath) {
  var service = this;
  var defaultValueArr = [];
  var permissionsArr = [];
  var items1 = "";
  var items2 = "";

    service.retrievePermissions = function (criterion, id1, id2, rlNumber1, rlNumber2) {
        $q.all([
            $http.get(ApiBasePath + "/" + criterion + "/" + id1 + "/" + rlNumber1),
            $http.get(ApiBasePath + "/" + criterion + "/" + id2 + "/" + rlNumber2)
        ])
        .then(function (response) {
           items1 = response[0].data;
           items2 = response[1].data;

           if (criterion === 'Permissions') {
               var processed = false;
               permissionsArr = makePermissionsArray(permissionsArr, items1, items2, processed);
           } 
        })
        .catch(function (errorResponse) {
          console.log("Error: " + errorResponse);
          throw errorResponse;
        });
    };
    ... so on

在我的makePermissionsArray()中,我这样做:

function makePermissionsArray(arr, items1, items2, processed) {
       var map = items1.storePermissions;
       var map2 = items2.storePermissions;
       var map3 = items1.allPermissions;

       for (var key in map) {
                arr.push({
                    'code': key,
                    'description': map3[key],
                    'repStorePermission1': map[key],
                    'repStorePermission2': map2[key]
                });
       }
}

我通过以下方式将此权限转发给控制器:

service.getPermissionsArr = function () {
        return permissionsArr;
};

注意&#39; arr&#39;在方法的参数中,makePermissionsArray()没有初始化,因为我通过在参数中传递permissionsArr来获取它。

现在流程如何:

  1. 首先,我从下拉列表中选择Store,点击按钮检索商店的配置。这给了我正确的回应。
  2. 然后我选择&#39;权限&#39;从下拉列表中,单击按钮从Db检索权限配置,它会卡住并且不会给我任何响应。
  3. 我以为我没有在update()方法中正确清除数组,经过一些长时间的搜索后我发现并更改了这些数组的初始化:

    configurableInput.defaultValueArray = [];
    configurableInput.permissionsArr = [];
    

    configurableInput.defaultValueArray.length = 0;
    configurableInput.permissionsArr.length = 0;
    

    在我的update()方法中。

    现在发生的是:

    1. 首先,我从下拉列表中选择Store,点击按钮检索商店的配置。这给了我正确的回应。
    2. 然后我选择&#39;权限&#39;从下拉列表中,单击按钮从Db检索权限配置,它给了我正确的响应。
    3. 我再次从下拉列表中选择Store,点击按钮,我得到正确答案。
    4. 但是当我再次选择&#39; Permissions&#39;从下拉列表中,单击按钮,它给我这个错误 - TypeError:无法读取属性&#39; push&#39;未定义的
    5. 我得到的错误是:

      arr.push({
           'code': key,
           'description': map3[key],
           'repStorePermission1': map[key],
           'repStorePermission2': map2[key]
      });
      

      由于这个问题,我真的在撕扯我的头发。有人可以帮我解决错误吗?

0 个答案:

没有答案