angularjs - раскрывающийся список зависит от другого раскрывающегося списка, который не работает, когда комбинация идентификатора/имени

Я использовал решение, предоставленное @Brocco здесь: Раскрывающийся список зависит от другого раскрывающегося списка - angularjs

Я заметил, что когда вы используете комбинацию идентификатора/имени в объекте для использования Angular, он автоматически терпит неудачу. Я протестировал это с предоставленной версией JSFiddle AngularJS, а также с последней версией AngularJS, и в обоих случаях это терпит неудачу.

JSFiddle:

http://jsfiddle.net/h8uoy9xr/ (обновленная ссылка на скрипку)

HTML:

<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.min.js"></script>
<div ng-app>
    <div ng-controller="MyCntrl">
        <select ng-model="server" ng-options="server.id as server.name for server in servers"></select>
        <!-- server.name for server in servers (This works a treat, but not the other way) -->
        <select ng-model="version" ng-options="version.id as version.name for version in server.version"></select>
    </div>
</div>

JS:

function MyCntrl($scope) {


    $scope.servers = 
       [
           {
               "id": 1,
               "name": "server1",
               "version":
               [
                   {id:1,name: "10.x"}
               ]
           },
           {
               "id": 2,
               "name": "server2",
               "version":
               [
                   {id:2,name:"1"}, {id:3,name:"2"}
               ]
           }
       ];


}

person adamj    schedule 12.11.2015    source источник
comment
Что вы подразумеваете под автоматически завершается ошибкой? Я открыл вашу скрипку, и второе раскрывающееся меню обновляется на основе правильного выбора в первом.   -  person fracz    schedule 12.11.2015
comment
Прошу прощения, случайно оказалась старая ссылка в буфере обмена предыдущего примера. Я обновил ссылку на скрипку выше, но вот она снова: jsfiddle.net/h8uoy9xr. Большое спасибо, что указали на это!   -  person adamj    schedule 12.11.2015


Ответы (1)


Если вы отобразите значение server, вы обнаружите, что он получает только идентификатор, а не весь присвоен объект.

Изменять

ng-options="server.id as server.name for server in servers"

to

ng-options="server as server.name for server in servers"

чтобы заставить его работать.

Значение перед ключевым словом as сохраняется в модели. Значение после используется в качестве метки в раскрывающемся списке.

person fracz    schedule 12.11.2015
comment
Ааааа теперь это имеет смысл! Большое спасибо за ваше объяснение в конце, оно помогло мне наконец осознать это. - person adamj; 12.11.2015
comment
Есть ли способ получить фактические идентификаторы в значении ‹option› при сохранении той же функциональности? Даже если мне придется реструктурировать приведенные выше данные. - person adamj; 12.11.2015
comment
Я отвечу на свой вопрос здесь, ради последовательности. Да, и структура данных может остаться прежней, вот как: server as server.name for server in servers track by server.id - person adamj; 12.11.2015