jak używać opcji ng do ustawienia domyślnej wartości wybranego elementu


148

Widziałem dokumentację dyrektywy Angular select tutaj: http://docs.angularjs.org/api/ng.directive:select . Nie wiem, jak ustawić wartość domyślną. To jest mylące:

wybierz jako etykietę wartości w szyku

Oto przedmiot:

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

HTML (działający):

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

a następnie próbuję dodać atrybut ng-option wewnątrz elementu select, aby ustawić prop.valuejako opcję domyślną (nie działa).

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

Co ja robię źle?

Odpowiedzi:


131

Zakładając więc, że obiekt jest w twoim zakresie:

<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"] 
  };
}

Working Plunkr: http://plnkr.co/edit/wTRXZYEPrZJRizEltQ2g


2
Ok, rozumiem! ng-optionjest zastąpienie <option ng-repeat="value in prop.values">{{value}}</option>ponownie dzięki
François Romain

2
Musi być prostszy sposób na zrobienie tego, uważam to za bardzo skomplikowane w przypadku prostego wyboru domyślnej wartości w angular js
Edmund Rojas

1
Dyrektywa ng-option jest nieco skomplikowana i myląca pod względem składni. Myślę, że elastyczność wiązania obiektów nieco skomplikowała sprawę. Sposób, w jaki staram się to zapamiętać, polega na tym, że za każdym razem, gdy używam obiektu, wyraźnie wskazuję, jakich właściwości należy użyć dla atrybutów wartość / tekst kontrolki wyboru. Aby uzyskać więcej informacji, zobacz: ozkary.com/2015/08/angularjs-ngoption-directive-simplified.html
ozkary

2
jeśli chcesz zbudować selekcję w widoku bez wypisywania opcji i wybrać jedną<select ng-model="limit" value="10" ng-options="v for v in [5,10,15,20,30,50]"></select>
asherrard

1
@james Kleeh .. tutaj zakodowałeś pierwszą opcję, skoro ją znasz, ale jeśli nie znamy opcji i jak możemy domyślnie wyświetlić pierwszą z nich?
H Varma

69

Dokumentacja kątowa dla select * nie odpowiada wprost na to pytanie, ale tak jest. Jeśli spojrzysz na script.js, zobaczysz to:

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
}

To jest html:

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

Wydaje się, że jest to bardziej oczywisty sposób domyślnego ustawienia wybranej wartości na <select>with ng-options. Będzie również działać, jeśli masz różne etykiety / wartości.

* To pochodzi z Angular 1.2.7


To zadziałało dla mnie, wątpię, że to się powtórzy, ale obecnie używam AngularJS v1.2.27 na wypadek, gdyby ktoś to znalazł i zastanawia się nad kompatybilnością.
Robert Cadmire

41

Ta odpowiedź jest bardziej przydatna, gdy przenosisz dane z bazy danych, wprowadzasz modyfikacje, a następnie utrwalasz zmiany.

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

Sprawdź przykład tutaj:

http://plnkr.co/edit/HrT5vUMJOtP9esGngbIV


Wreszcie działająca odpowiedź tutaj, przegłosowana! Również w przypadku tego rozwiązania niezdefiniowana opcja może działać poprawnie. <option value = ""> Wybierz </option>
DDD,

Cieszę się, że ten post istnieje, szukałem przez jakiś czas rozwiązania, a ten rozwiązał mój problem.
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
Zła praktyka tutaj ... Spójrz na drugą żółtą notatkę: docs.angularjs.org/api/ng/directive/select .
M'sieur Toph '16

to nie zadziała, np. kiedy spróbujesz edytować rekord, w jaki sposób rekord zostanie powiązany z polem?
windmaomao

21

Jeśli twoja tablica obiektów jest złożona, na przykład:

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

Twój obecny model był ustawiony na coś takiego:

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

Pomogło to w użyciu track byfunkcji na uuid (lub jakimkolwiek unikalnym polu), o ile ng-model = "user.friend" również ma uuid:

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

Ta odpowiedź zrobiła mój dzień! Spójrz również na ścieżkę w tej dokumentacji: docs.angularjs.org/api/ng/directive/ngOptions
Arashsoft

To najlepsza odpowiedź!
Gerfried

10

Zmagałem się z tym przez kilka godzin, więc chciałbym dodać do tego kilka wyjaśnień, wszystkie przytoczone tutaj przykłady odnoszą się do przypadków, w których dane są ładowane z samego skryptu, a nie z usługi lub bazy danych, więc chciałbym przekazać moje doświadczenie każdemu, kto ma ten sam problem, co ja.

Zwykle zapisujesz tylko identyfikator żądanej opcji w swojej bazie danych, więc ... pokażmy to

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; 
});
});

Wreszcie częściowy html model.html

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

w zasadzie chciałem wskazać ten element „ model.id_model jako model.name dla modelu w modelach ”, „ model.id_model ” używa identyfikatora modelu dla wartości, aby można było dopasować go do „ mainObj.id_model ”, który jest również „ selected_model ”, to tylko zwykła wartość, również „ as model.name ” to etykieta dla repeatera, wreszcie „ model in models ” to zwykły cykl, o którym wszyscy wiemy.

Mam nadzieję, że to komuś pomoże, a jeśli tak, zagłosuj za: D


1
możesz po prostu powiązać zaznaczenie mainObj.id_modelbezpośrednio ( ng-model="mainObj.id_model"), zamiast używać zmiennej selected_model
``

tak, rzeczywiście, chciałem tylko pokazać, że można to zrobić z wartością znajdującą się bezpośrednio w zakresie $, ale dziękuję za zwrócenie uwagi.
Wiston Coronell,

Czy można powiązać obiekt, a nie tylko int? Nie mogę zmusić moich nGoptions do ustawienia wybranej pozycji, ponieważ nie wiem, jak powiązać mój {id: 24} z moim [{id: 23}, {id: 24}, {id: 25}].
Victorio Berra

zawsze możesz użyć $ index, aby uzyskać pozycję, jednak tak, możliwe jest powiązanie z obiektem
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>

Po prostu dodaj opcję z pustą wartością. To będzie działać.

DEMO Plnkr


To naprawdę działa, jeśli dodasz coś takiego<option value="" disabled>Please Select</option>
fWd82

9

Łatwiejszym sposobem jest użycie data-ng-init w następujący sposób:

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

Główna różnica polega na tym, że musisz uwzględnić data-ng-model


3
Jak określono w dokumentacji: Jedynym właściwym zastosowaniem ngInit jest aliasowanie specjalnych właściwości ngRepeat, jak pokazano na poniższym demo. Oprócz tego do inicjowania wartości w zakresie należy raczej używać kontrolerów niż ngInit.
user12121234

1
Sposób, w jaki publikowałem, z opcjami ng, jest znacznie łatwiejszy i bardziej konkretny. Oba sposoby działają.
Wyetro

3

Ng model zestawów atrybutów wybranej opcji, a także pozwala na zamontowanie filtra jak 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
Próbuję tego i widzę angular.js:117 TypeError: a.forEach is not a function. jakieś pomysły?
karmenizm

1

Jeśli ktoś korzysta z wartości domyślnej, która czasami nie jest wypełniana na stronie w przeglądarce Chrome, IE 10/11, Firefox - spróbuj dodać ten atrybut do pola wejściowego / wyboru, sprawdzając wypełnioną zmienną w kodzie HTML, na przykład:

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

0

Naprawdę proste, jeśli nie zależy ci na indeksowaniu opcji za pomocą jakiegoś numerycznego identyfikatora.

  1. Zadeklaruj swoją tablicę $ scope var - people

    $scope.people= ["", "YOU", "ME"];
  2. W DOM o powyższym zakresie utwórz obiekt

    <select ng-model="hired" ng-options = "who for who in people"></select>
  3. W kontrolerze ustawiasz model ng-model „zatrudniony”.

    $scope.hired = "ME";

Powodzenia!!! To naprawdę proste!


0

Podsumowując, zrobiłem coś takiego.

 <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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.