як за допомогою ng-опції встановити значення за замовчуванням елемента вибору


148

Я бачив тут документацію директиви Angular select: http://docs.angularjs.org/api/ng.directive:select . Я не можу зрозуміти, як встановити значення за замовчуванням. Це заплутано:

вибрати як мітку для значення масиву

Ось об’єкт:

{
    "type": "select", 
    "name": "Service",
    "value": "Service 3", 
    "values": [ "Service 1", "Service 2", "Service 3", "Service 4"] 
}

Html (працює):

<select><option ng-repeat="value in prop.values">{{value}}</option></select>

а потім я намагаюся додати атрибут ng-option всередині елемента вибору, щоб встановити його prop.valueяк параметр за замовчуванням (не працює).

ng-options="(prop.value) for v in prop.values"

Що я роблю неправильно?

Відповіді:


131

Тож припускаючи, що об’єкт знаходиться у вашому обсязі:

<div ng-controller="MyCtrl">
  <select ng-model="prop.value" ng-options="v for v in prop.values">
  </select>
</div>

 

function MyCtrl($scope) {
  $scope.prop = {
    "type": "select", 
    "name": "Service",
    "value": "Service 3", 
    "values": [ "Service 1", "Service 2", "Service 3", "Service 4"] 
  };
}

Робочий Plunkr: http://plnkr.co/edit/wTRXZYEPrZJRizEltQ2g


2
добре. Я зрозумів! ng-optionвитісняє <option ng-repeat="value in prop.values">{{value}}</option>ще раз спасибі
Франсуа Romain

2
Має бути простіший спосіб зробити це, я вважаю це дуже складним для простого вибору значення за замовчуванням у кутовому js
Едмунд Рохас

1
Директива ng-варіанту є дещо складною і заплутаною у своєму синтаксисі. Я думаю, що гнучкість зв’язування предметів зробила це трохи складніше. Я намагаюся запам’ятати це, що коли я використовую об’єкт, я чітко вказую, які властивості використовувати для атрибутів значення / текст елемента управління вибору. Для отримання додаткової інформації дивіться це: ozkary.com/2015/08/angularjs-ngoption-directive-simplified.html
ozkary

2
якщо ви хочете створити виділення у представленні даних, не виписуючи параметри, і вибрали один <select ng-model="limit" value="10" ng-options="v for v in [5,10,15,20,30,50]"></select>
asherrard

1
@james Kleeh .. звідки у вас є жорстке кодування першого варіанту, оскільки ви їх знаєте. Але якщо ми не знаємо варіантів і як ми можемо відображати перший за замовчуванням?
H Варма

69

Кутова документація для вибору * не відповідає на це питання в явному вигляді, але вона є. Якщо ви подивитеся на script.js, ви побачите це:

function MyCntrl($scope) {
  $scope.colors = [
    {name:'black', shade:'dark'},
    {name:'white', shade:'light'},
    {name:'red', shade:'dark'},
    {name:'blue', shade:'dark'},
    {name:'yellow', shade:'light'}
  ];
  $scope.color = $scope.colors[2]; // Default the color to red
}

Це html:

<select ng-model="color" ng-options="c.name for c in colors"></select>

Це, мабуть, є більш очевидним способом дефолту вибраного значення для <select>з ng-options. Крім того, він буде працювати, якщо у вас різні етикетки / значення.

* Це з кутового 1.2.7


Це працювало для мене, я сумніваюся, що це з’явиться знову, але я зараз використовую AngularJS v1.2.27 у випадку, якщо хтось знайде це і цікавиться сумісністю.
Роберт Кадмір

41

Ця відповідь є більш корисною, коли ви приносите дані з БД, вносите зміни та зберігаєте зміни.

 <select  ng-options="opt.id as opt.name for opt in users" ng-model="selectedUser"></select>

Перевірте приклад тут:

http://plnkr.co/edit/HrT5vUMJOtP9esGngbIV


Зрештою, тут працює працездатна відповідь! Також за допомогою цього рішення ви можете мати належним чином не визначений варіант роботи. <option value = ""> Виберіть </option>
DDD

Тож радий, що ця публікація існує, я деякий час шукав рішення, і ця проблема вирішила мою проблему.
slee423

22
<select name='partyid' id="partyid" class='span3'>
<option value=''>Select Party</option>
<option ng-repeat="item in partyName" value="{{item._id}}" ng-selected="obj.partyname == item.partyname">{{item.partyname}}
</option>
</select>

5
Тут погана практика ... Подивіться на другу жовту примітку: docs.angularjs.org/api/ng/directive/select .
M'sieur Toph '16

це не спрацює, колишній. коли ви намагаєтесь відредагувати запис, як запис буде зв’язуватися з полем?
windmaomao

21

Якщо ваш масив об'єктів складний, наприклад:

$scope.friends = [{ name: John , uuid: 1234}, {name: Joe, uuid, 5678}];

І ваша поточна модель була налаштована на щось подібне:

$scope.user.friend = {name:John, uuid: 1234};

Це допомогло використовувати track byфункцію uuid (або будь-яке унікальне поле), якщо ng-model = "user.friend" також має uuid:

<select ng-model="user.friend" 
ng-options="friend as friend.name for friend in friends track by friend.uuid"> 
</select>

Ця відповідь зробила мій день! Подивіться також на цю документацію: docs.angularjs.org/api/ng/directive/ngOptions
Arashsoft

Це найкраща відповідь!
Герфрід

10

Я боровся з цим пару годин, тому хотів би додати деякі пояснення до цього. Усі приклади, зазначені тут, стосуються випадків, коли дані завантажуються із самого сценарію, а не з сервісу чи бази даних, тому я хотів би надати свій досвід тому, хто має таку ж проблему, як я.

Зазвичай ви зберігаєте лише ідентифікатор потрібного параметра у вашій базі даних, тому ... давайте покажемо його

service.js

myApp.factory('Models', function($http) {
var models = {};
models.allModels = function(options) {
    return $http.post(url_service, {options: options});
};

return models;
});

controller.js

myApp.controller('exampleController', function($scope, Models) {
$scope.mainObj={id_main: 1, id_model: 101};
$scope.selected_model = $scope.mainObj.id_model;
Models.allModels({}).success(function(data) {
    $scope.models = data; 
});
});

Нарешті, частковий html model.html

Model: <select ng-model="selected_model" 
ng-options="model.id_model as model.name for model in models" ></select>

в основному я хотів вказати на цю частину " model.id_model як model.name для моделі в моделях ", " model.id_model " використовує ідентифікатор моделі для значення, щоб ви могли співставитись з " mainObj.id_model ", який також " selected_model ", це просто звичайне значення, також " як model.name " є міткою для ретранслятора, нарешті, " модель в моделях " - це просто регулярний цикл, про який ми всі знаємо.

Сподіваюся, це комусь допоможе, і якщо це станеться, будь ласка, проголосуйте: D


1
ви можете просто прив’язати вибір mainObj.id_modelбезпосередньо до ( ng-model="mainObj.id_model"), а не використовувати змінну 'заповнювач / звичайне значення'selected_model
drzaus

так, дійсно, я просто хотів показати, що це може бути зроблено зі значенням безпосередньо в межах $ $, але дякую, що вказали на це.
Вістон Коронелл

Чи можна прив’язати до об'єкта, а не лише до int? Я не можу змусити nGoptions встановити вибраний елемент, оскільки він не знає, як пов'язати мій {id: 24} до мого [{id: 23}, {id: 24}, {id: 25}].
Вікторіо Берра

Ви завжди можете використовувати $ index, щоб отримати позицію, але так, можливо, можна прив'язати до об'єкта
Wiston Coronell

10
<select id="itemDescFormId" name="itemDescFormId" size="1" ng-model="prop" ng-change="update()">
    <option value="">English(EN)</option>
    <option value="23">Corsican(CO)</option>
    <option value="43">French(FR)</option>
    <option value="16">German(GR)</option>

Просто додайте параметр із порожнім значенням. Це спрацює.

DEMO Plnkr


Це дійсно спрацьовує, якщо додати щось на кшталт<option value="" disabled>Please Select</option>
fWd82,

9

Простіший спосіб зробити це - використовувати data-ng-init таким чином:

<select data-ng-init="somethingHere = options[0]" data-ng-model="somethingHere" data-ng-options="option.name for option in options"></select>

Основна відмінність тут полягає в тому, що вам потрібно буде включити data-ng-model


3
Як зазначено в документах: Єдине правильне використання ngInit - це вилучення спеціальних властивостей ngRepeat, як видно з демонстрації нижче. Крім цього випадку, вам слід використовувати контролери, а не ngInit для ініціалізації значень на області.
користувач12121234

1
Те, що я розмістив з ng-опціями, набагато простіше і конкретніше. Обидва способи працюють.
Wyetro

3

Атрибут ng-model встановлює вибраний параметр, а також дозволяє передавати фільтр, як orderBy: orderModel.value

index.html

<select ng-model="orderModel" ng-options="option.name for option in orderOptions"></select>

controllers.js

$scope.orderOptions = [
    {"name":"Newest","value":"age"},
    {"name":"Alphabetical","value":"name"}
];

$scope.orderModel = $scope.orderOptions[0];

1
Спробую це, і я бачу angular.js:117 TypeError: a.forEach is not a function. Будь-які думки?
карменізм

1

Якщо хтось стикається зі значенням за замовчуванням, час від часу не заповнюється на сторінці в Chrome, IE 10/11, Firefox - спробуйте додати цей атрибут до вашої введення / вибору поля для перевірки заселеної змінної в HTML, наприклад:

<input data-ng-model="vm.x" data-ng-if="vm.x !== '' && vm.x !== undefined && vm.x !== null" />

0

Дійсно просто, якщо вам не байдуже індексувати свої параметри деяким числовим ідентифікатором.

  1. Задекларуйте свій $ range var - люди масив

    $scope.people= ["", "YOU", "ME"];
  2. У DOM вищевказаного діапазону створіть об’єкт

    <select ng-model="hired" ng-options = "who for who in people"></select>
  3. У своєму контролері ви встановлюєте свою ng-модель "найманою".

    $scope.hired = "ME";

Удачі!!! Це дуже просто!


0

Тільки щоб додати, я зробив щось подібне.

 <select class="form-control" data-ng-model="itemSelect" ng-change="selectedTemplate(itemSelect)" autofocus>
        <option value="undefined" [selected]="itemSelect.Name == undefined" disabled="disabled">Select template...</option>
        <option ng-repeat="itemSelect in templateLists" value="{{itemSelect.ID}}">{{itemSelect.Name}}</option></select>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.