Ошибка типа: $ scope.array.reduce не является функцией

0

У меня есть 3 раскрывающихся списка, которые загружают атрибуты, относящиеся к странице. Эти атрибуты: инструменты, стиль, скоринг. Атрибуты загружаются из служебного вызова.

Пример использования инструментов:

  //Get Instruments
  $http.get('/api/Instrument/GetAllInstruments').success(function (data, status, headers, config) {
      $scope.instruments = data;
  }).error(function (data, status, headers, config) {
      $scope.error = "An Error has occured while fetching Instruments!" + data;
  });

и html:

<select class="form-control" 
        name="recordInstrument" 
        data-ng-model="recordInstrument" 
        required
        data-ng-options="i.ID as i.Description for i in instruments">
    <option value="">-- Choose an Instrument --</option>
</select>

Пользователь может выбрать запись из списка, а в форме - значения этой записи. Эти значения также включают значения атрибутов, которые устанавливают выбранное значение для раскрывающихся списков.

Когда пользователь нажимает на запись, вызывается функция "edit". Функция вызывает службу, которая получает запись, тогда она выполняет оператор if, чтобы определить, не является ли массив атрибутов записи пустым. Если массив атрибутов не пуст, он выполняет цикл forEach в массиве, устанавливает ng-модель, в этом случае "$ scope.recordInstrument", чтобы для значения раскрывающегося списка было выбрано выбранное значение по умолчанию. Если массив пуст, то он устанавливает ng-модель в 0, чтобы сбросить раскрывающийся список до значения, выбранного без записи "Выберите инструмент".

Вот этот фрагмент кода://Редактировать страницу хранилища $ scope.edit = function() {

      if (this.page.SPPreambleID === null || this.page.SPPreambleID === 0) {
          this.page.SPPreambleID = -1;
      }

      $http.get('/api/StorePage/GetStorePage?StorePageID=' +
        this.page.StorePageID +
        '&SPPreambleID=' +
        this.page.SPPreambleID).success(function (data) {

            $scope.updateShow = true;
            $scope.addShow = false;
            $scope.newpage = data;

            if (data.SPAttributeRefID.length > 0) {

                angular.forEach($scope.newpage.SPAttributeRefID, function (attribute, index) {

                    if (attribute == 1) {

                        $scope.instruments = $scope.instruments.reduce(function (result, instrument) {
                            result[instrument.ID] = instrument;
                            return result
                        }, {});

                        $scope.recordInstrument = $scope.instruments[data.AttributeID[0]].ID;
                    };

                    if (attribute == 2) {

                        $scope.style = $scope.styles.reduce(function (result, style) {
                            result[style.ID] = style;
                            return result
                        }, {});
                        $scope.recordStyle = $scope.styles[data.AttributeID[1]].ID;
                    };

                    if (attribute == 3) {
                        $scope.scoring = $scope.scorings.reduce(function (result, scoring) {
                            result[scoring.ID] = scoring;
                            return result
                        }, {});
                        $scope.recordScoring = $scope.scorings[data.AttributeID[2]].ID;
                    };
                });
            }
            else {
                $scope.recordInstrument = 0;
                $scope.recordStyle = 0;
                $scope.recordScoring = 0;
            }
        }).error(function () {
            $scope.error = "An Error has occured while Editing this Store Page!" + data;
        });
  }

Приведенный выше код работал до того, как я поместил строку if: if ($ scope.newpage.SPAttributeRefID.length> 0) {...}

Причина, по которой я добавил if, чтобы проверить длину массива, состояла в том, что в некоторых записях нет нисходящих атрибутов, и если бы я исходил из предыдущей записи, у которой были значения, тогда выпадающие списки останутся с этими значениями из предыдущей записи.

После того, как я добавил if, я начал получать ошибку, указывающую на функцию сокращения, и я не уверен, что я делаю неправильно.

Я хотел бы попросить помощи, пытаясь решить эту проблему.

Большое спасибо.

Теги:
arrays
reduce

2 ответа

1

Я больше не использовал.reduce. Я изменил код на использование цикла for после публикации нового вопроса и получения рабочего ответа: JavaScript: сгладить массив без использования библиотеки сокращений

Вот фрагмент кода, который заменяет функцию сокращения:

if (attribute == 1) {

    var arrInstruments = $scope.instruments;
    var arrLength = arrInstruments.length;
    var result = {}
    for (var i = 0; i < arrLength; i++) {
        result[arrInstruments[i].ID] = arrInstruments[i];
    }
    $scope.recordInstrument = result[$scope.newpage.AttributeID[0]].ID;
}
0

Похоже, ваша проблема здесь.

});
// you have a closing bracket missing
    }else {
        $scope.recordInstrument = 0;
    }
}).error(function () {
    $scope.error = "An Error has occured while Editing this Store Page!" + data;
});

Исправлена

});
  };  // added a close bracket
    }else {
        $scope.recordInstrument = 0;
    }
}).error(function () {
    $scope.error = "An Error has occured while Editing this Store Page!" + data;
});
  • 0
    Я думаю, что я вставил свой код неправильно и удалил несколько строк, которые я не должен делать, чтобы уменьшить его перед публикацией. Я обновил код для функции редактирования, так что вы можете видеть, что если я добавлю эту точку с запятой, код сломается, оставив остальное вне условия.
  • 0
    @erasmocarlos ага, да .. моя ошибка. Глядя снова на эту строку,}). Error (function () мне кажется, что) пытается закрыть, когда этого не должно быть. } .error (функция () может быть исправлением.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню