#javascript #html #angularjs #drop-down-menu
#javascript #HTML #angularjs #выпадающее меню
Вопрос:
Я использую AngularJS, и мне нужно установить выбранный параметр элемента управления выпадающим списком, когда запись выбрана для редактирования и загружена в форму. В выпадающем списке все равно должны быть доступны другие значения, если пользователь хочет выбрать другое.
Если запись не выбрана, в форме все равно должен быть доступен список значений, если пользователь хочет создать новую запись.
Ниже приведен снимок экрана моей формы при ее первой загрузке. На снимке экрана видно, что в раскрывающемся списке Инструменты отображаются все доступные инструменты. Этот список загружается через веб-службу, которая вызывается при загрузке формы.
Он помещает все содержимое в массив с именем: $scope.instruments
Код:
//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 occurred while fetching Instruments." data;
});
Под формой находится сетка со всеми записями:
Когда пользователь нажимает на значок редактирования, запись загружается в форму:
В записи есть значения для инструмента, стиля и оценки, но я не знаю, как использовать эти значения из записи, чтобы установить выбранное значение в раскрывающемся списке.
Это код, который я использую для загрузки выбранной записи и присвоения идентификатора инструмента, идентификатора стиля, идентификатора оценки. Это не самый элегантный код, но это все, что я смог получить:
//Edit Store Page
$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 'amp;SPPreambleID=' this.page.SPPreambleID).success(function (data) {
$scope.updateShow = true;
$scope.addShow = false;
$scope.newpage = data;
angular.forEach($scope.newpage.SPAttributeRefID, function (attribute, index) {
if (attribute == 1) {
$scope.recordInstrument = $scope.newpage.AttributeID[0];
}
if (attribute == 2) {
$scope.recordStyle = $scope.newpage.AttributeID[1];
}
if (attribute == 3) {
$scope.recordScoring = $scope.newpage.AttributeID[2];
}
});
}).error(function () {
$scope.error = "An Error has occured while Editing this Store Page!" data;
});
}
И это HTML для выпадающих списков:
@* Instrument *@
<div class="form-group">
<div class="col-sm-10 space">
<select class="form-control" name="instrumentfilter" data-ng-model="instrumentfilter" required
data-ng-options="i.ID as i.Description for i in instruments track by i.ID" data-ng-change="">
<option value="">-- Choose a Style --</option>
</select>
</div>
</div>
@* Style *@
<div class="form-group">
<div class="col-sm-10 space">
<select class="form-control" name="stylefilter" data-ng-model="stylefilter" required
data-ng-options="st.ID as st.Description for st in styles track by st.ID" data-ng-change="">
<option value="">-- Choose a Style --</option>
</select>
</div>
</div>
@* Scoring *@
<div class="form-group">
<div class="col-sm-10 space">
<select class="form-control" name="scoringfilter" data-ng-model="scoringfilter" required
data-ng-options="sc.ID as sc.Description for sc in scorings track by sc.ID">
<option value="">-- Choose a Scoring --</option>
</select>
</div>
</div>
Пожалуйста, любая помощь, которую я могу получить на этом форуме, была бы отличной. Я боролся с этим весь день, и я уверен, что это не должно быть слишком сложно.
Обновить
Это обновленный HTML после рекомендации изменить data-ng-model для использования переменных области видимости recordInstrument, recordStyle и recordScoring.
@* Instrument *@
<div class="form-group">
<div class="col-sm-10 space">
<select class="form-control" name="instrumentfilter" data-ng-model="recordInstrument" required
data-ng-options="i.ID as i.Description for i in instruments track by i.ID" data-ng-change="">
<option value="">-- Choose a Style --</option>
</select>
</div>
</div>
@* Style *@
<div class="form-group">
<div class="col-sm-10 space">
<select class="form-control" name="stylefilter" data-ng-model="recordStyle" required
data-ng-options="st.ID as st.Description for st in styles track by st.ID" data-ng-change="">
<option value="">-- Choose a Style --</option>
</select>
</div>
</div>
Ответ №1:
предполагая, что JS-код
angular.forEach($scope.newpage.SPAttributeRefID, function (attribute, index) {
if (attribute == 1) {
$scope.recordInstrument = getRecordInstrument($scope.newpage.AttributeID[0]);
}
if (attribute == 2) {
$scope.recordStyle = getRecordStyle($scope.newpage.AttributeID[1]);
}
if (attribute == 3) {
$scope.recordScoring = getRecordScoring($scope.newpage.AttributeID[2]);
}
});
получите правильные идентификаторы, и есть 3 функции getRecordInstrument, getRecordStyle и getRecordScoring, которые извлекают объекты инструмента, стиля или оценки по его идентификатору, попробуйте назначить эти идентификаторы для выбора с помощью директивы ngModel:
@* Style *@
<div class="form-group">
<div class="col-sm-10 space">
<select class="form-control" name="instrumentfilter" data-ng-model="recordInstrument" required
data-ng-options="i.ID as i.Description for i in instruments track by i.ID">
<option value="">-- Choose a Style --</option>
</select>
</div>
</div>
@* Style *@
<div class="form-group">
<div class="col-sm-10 space">
<select class="form-control" name="stylefilter" data-ng-model="recordStyle" required
data-ng-options="st.ID as st.Description for st in styles track by st.ID">
<option value="">-- Choose a Style --</option>
</select>
</div>
</div>
@* Scoring *@
<div class="form-group">
<div class="col-sm-10 space">
<select class="form-control" name="scoringfilter" data-ng-model="recordScoring" required
data-ng-options="sc.ID as sc.Description for sc in scorings track by sc.ID">
<option value="">-- Choose a Scoring --</option>
</select>
</div>
</div>
Комментарии:
1. Когда я нажимаю на запись для редактирования, идентификаторы назначаются правильно, то есть: recordInstrument = 506, который является клавиатурой, recordStyle = 183, который является Acid Jzz, и recordScoring = 45, который является оркестром. Запись загружается в каждое поле, но я не вижу только что упомянутых переменных, которые используются для установки выпадающих списков на эти идентификаторы. Ничего не происходит, и я тоже не вижу ошибки.
2. вы обновили свой HTML, чтобы использовать правильные ngModels? например: data-ng-model=»recordScoring», эта переменная области видимости должна корректно обновить поле выбора. Посмотрите мой ответ и убедитесь, что вы изменили 3 data-ng-model в своем HTML
3. пожалуйста, загрузите свой код в plunker или что-то в этом роде, чтобы я мог увидеть, что там не так, и, надеюсь, решить это. Также убедитесь, что у вас есть значение ID, которое вы присваиваете области видимости в параметрах выбора
4. Спасибо за вашу помощь. Я загрузил код в jsfiddle, но на самом деле ничего не делает. Я просто загрузил, чтобы вы могли видеть весь js. jsfiddle.net/itortu/sd7hzp38 Код, который вы хотите увидеть, находится в разделе //Редактировать страницу магазина. и, возможно, раздел //GetInstruments тоже.
5. вы должны преобразовать массив $scope.instruments в объект только один раз, в начале вашего контроллера (см. Мой обновленный plunker — plnkr.co/edit/E4D9hRmujc5meQzmnvEx?p=preview ), например. reduce() — это функция массива, а не объекта, поэтому убедитесь, что вы запускаете ее только один раз в $scope.instruments как массив. Я не понял ваш предыдущий вопрос, для правильного отображения в поле выбора инструмент должен иметь только атрибуты ID и description.