angular select 'track by' сбрасывает выбранный

Я изо всех сил пытаюсь получить «выбранный» для работы с «отслеживанием» для элемента выбора Angular. У меня есть следующий выбор:

    <select id="licenseType" ng-model="selectedLicense" 
            ng-options="key for (key, value) in licenseMap track by key" 
            ng-change="doUpdate()">
    </select> 

с этим js:

$scope.selectedLicense = $scope.licenseMap["Please Select"];

Вышеупомянутый js работает, когда я избавляюсь от «дорожки по клавише» - первоначальный выбор становится предустановленным. При использовании «дорожки по ключу» предварительный выбор остается пустым. Мне нужно «отслеживать по ключу», чтобы получить выбранное значение, это единственное, что сработало до сих пор. До сих пор я пробовал следующую комбинацию, которая не сработала:

/*
var license = document.getElementById('licenseType');
license.options.selectedIndex = 1;
license.options[license.options.selectedIndex].selected = true;
$("#licenseType").val("Please Select");
$('#licenseType').children('option[value="1"]').attr('selected', true);     
*/

Я буду очень признателен за помощь здесь, чтобы заставить его работать. Спасибо.


person user2917629    schedule 29.09.2016    source источник
comment
зачем тебе трек по? В doUpdate() вы должны получить доступ к selectedLicense и сразу же получить выбранное значение.   -  person Dylan    schedule 30.09.2016
comment
@user2917629: user2917629: мой выбор — это многомерный массив, и отслеживание — единственный прием, который позволяет получить выбранный ключ, иначе я получаю обратно массивы   -  person user2917629    schedule 30.09.2016


Ответы (1)


сделайте что-то вроде этого: http://codepen.io/alex06/pen/XjarJd

div(data-ng-app="app")
 div(ng-controller="appController")
   select.form-control(ng-model="selectedItem", ng-options="option.value as option.name for option in typeOptions track by option.value" ng-init="selectedItem=typeOptions[0]")


(function(){
  'use strict'
  angular
    .module('app', [])
    .controller('appController', ['$scope', function($scope){

      $scope.typeOptions = [
        { name: 'Feature', value: 'feature' }, 
        { name: 'Bug', value: 'bug' }, 
        { name: 'Enhancement', value: 'enhancement' }
       ];
    }])
})()

Пример сделан на нефрите, но синтаксис почти такой же. Кстати, если вы все же хотите работать с объектом вместо массива, вы также можете сделать это:

<!DOCTYPE html>
<html ng-app="app">

<head>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.min.js">              </script>
  <link rel="stylesheet" href="style.css" />
  <script type="text/javascript">
    angular.module('app', [])
      .controller('IndexCtrl', ['$scope', function($scope) {
        $scope.types = {
          1: "value1",
          2: "value2",
          5: "value3"
        };
      }]);
    </script>
  </head>
  <body ng-app="app" ng-controller="IndexCtrl">
    <select ng-model="type" ng-options="k as v for (k, v) in types">
      <option value="">Please select</option>
    </select>
  </body>

</html>
person Alexander P.    schedule 29.09.2016
comment
Я только что попробовал ng-init=selectedItem=typeOptions[0] с моими собственными ссылками на данные, но все равно не повезло. - person user2917629; 30.09.2016
comment
Обратите внимание, что пример, который я загрузил, использует массив, а ваш, я думаю, использует простой объект. Вот почему я загрузил перо с массивом, а затем другое с объектом, если вам просто нужно выбрать параметр по умолчанию без значения, используйте мой второй пример. - person Alexander P.; 30.09.2016
comment
Я попытался использовать ‹option value=›Please select‹/option› в select вместе с ng-init, но они не выбирают предварительно, я думаю, потому что я работаю с многомерными массивами. - person user2917629; 30.09.2016