Angularjs - динамические ng-опции
Для необходимости директивы, которую я пишу, мне нужно динамически построить выражение ng-options. Вот что я пробовал.
В моей директиве:
// ... scope.labelProperty = 'name';
scope.selectOptions = "l." + scope.labelProperty + " for l in list";
В моем html-шаблоне:
<select class="form-control"
ng-model="selected.available"
ng-options="{{ selectOptions }}"
multiple
size="5"></select>
В результате ng-options принимают правильное выражение "l.name для l в списке", но параметры не отображаются.
Пожалуйста, любая идея?
Ответы
Ответ 1
Измените свой код так, чтобы он выглядел (используйте javascript, чтобы выбрать вашу собственность):
// ... scope.labelProperty = 'name';
scope.selectOptions = "l[labelProperty] for l in list";
<select class="form-control"
ng-model="selected.available"
ng-options="{{ selectOptions }}"
multiple
size="5"></select>
Ответ 2
Я знаю, что это старый вопрос, но многие ответы на мои вызовы исходят из устаревших ответов на вопрос о Stackoverflow (так кто знает, поможет ли это кому-то помочь?), и мне потребовалось некоторое время, чтобы выяснить, как это сделать это. Я рассмотрел нижеследующее решение, рассмотрев концепцию "Cascading Dropdown Menus" - технический термин, который я узнал в этом поиске. Это может быть не самый лучший способ сделать это, но это было лучшее, что я мог бы придумать сейчас, и не видел такого примера в Интернете, который, как я думал, я бы разделил.
Я попробовал реализовать ng-options на основе выражения Andrew Church, но я обнаружил, что если вы сделаете это в выборе:
ng-options="{{ selectOptions }}"
Где позволяет выбрать selectOptions в вашем контроллере как:
$scope.selectOptions = "product.description for product in productList"
а затем вы измените его позже в коде, скажем, по выбору пользователя в другом раскрывающемся меню:
$scope.selectOptions = "cat.name for cat in catList"
Вы обнаружите, что если вы проверите элемент select в средстве разработчика браузера (или, посмотрев исходный код), что элемент выбора теперь действительно читается с помощью 'ng-options = "cat.name для cat в catList" ', но элемент не будет обновлен, чтобы показать новые параметры. То есть - Angular не перезапускает функцию ng-options при изменении.
Более динамичный способ выполнить это я обнаружил, что не было проблем с обновлением, вместо этого вместо него были не ng-options, а сами элементы параметров:
<select class="form-control"
ng-model="selected.available">
<option ng-if="selectOptions == 'products'" ng-repeat="product in productList" value="{{product}}">{{product.name}}</option>
<option ng-if="selectOptions == 'cats'" ng-repeat="cat in catList" value="{{cat}}">{{cat.name}}</option>
</select>
Таким образом вы можете установить ng-change в другое раскрывающееся меню, чтобы вызвать функцию, которая устанавливает selectOptions для продуктов/кошек/что вам нужно. Angular уже имеет встроенную функциональность, чтобы знать, чтобы скрыть/показать элемент option с помощью ng-if.