У меня есть 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, я начал получать ошибку, указывающую на функцию сокращения, и я не уверен, что я делаю неправильно.
Я хотел бы попросить помощи, пытаясь решить эту проблему.
Большое спасибо.
Я больше не использовал.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;
}
Похоже, ваша проблема здесь.
});
// 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;
});