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.имя для l в списке", но параметры не отображаются.

пожалуйста, любые идеи ?

2 ответов


измените свой код так (используйте 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>

Я знаю, что это старый вопрос, но многие ответы на мои проблемы исходят из устаревших ответов на вопросы Stackoverflow (так кто знает, поможет ли это кому-то еще!) и мне потребовалось некоторое время, чтобы понять, как это сделать. Я придумал приведенное ниже решение, изучив концепцию "каскадных раскрывающихся меню" - технический термин, который я узнал в этом поиске. Возможно, это не лучший способ сделать это, но это было лучшее, что я мог придумать на данный момент и не видел пример, как это в Интернете, я думал, что поделюсь.

Я попытался реализовать выражение Эндрю Черча на основе ng-опций, но я обнаружил, что если вы сделаете это в select:

ng-options="{{ selectOptions }}"

где допустим, выберитефункции определяется в контроллере так:

$scope.selectOptions = "product.description for product in productList"

а затем вы измените его позже в коде, скажем, по выбору пользователей в другом раскрывающемся меню:

$scope.selectOptions = "cat.name for cat in catList"

вы найдете, если вы проверите элемент select в a инструмент разработчика браузера (или, глядя на исходный код), который элемент select теперь фактически читает с помощью"ng-options=" 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 уже имеет встроенную функциональность, чтобы знать, чтобы скрыть / показать элемент опции с ng-if.