2013-07-29 10 views
14

Mam problem z ng-model na element select podczas przekazywania obiektu z elementów option. Więc wyobraź sobie, mamy szereg kolumn z tabeli o nazwie columns (definicja tabeli) i chcielibyśmy creat niektórych filtrów na tej definicjiJak wykonać kątowy model pracy z obiektami w wybranych elementach?

var columns = [ 
    {name: 'Account ID', type: 'numeric'}, 
    {name: 'Full name',  type: 'text'}, 
    {name: 'Date of birth', type: 'date'}, 
    {name: 'Active',  type: 'boolean'} 
    // and so on 
]; 

var filters = [{}]; 

HTML:

<div class="form-field" ng-repeat="filter in filters"> 
    <select ng-model="filter"> 
    <option value="" disabled>Choose filter</option> 
    <option ng-repeat="column in columns" ng-value="column">{{column.name}}</option> 
    </select> 
    <input type="text" ng-model="filter.value"> 
</div> 

jak można zobaczyć, chciałabym tego filter aby uzyskać wartość column i dodać konkretne dane w nim, więc w pewnym momencie, mój filtr może być tak:

[ 
    {name: 'Account ID', type: 'numeric', value: 123}, 
    {name: 'Active', type: 'boolean', value: 'Yes'} 
] 

W każdym razie, nie jestem pewny, czy to jest sposób na zrobienie tego, ale chciałbym wiedzieć, w jaki sposób mogę osiągnąć to zachowanie, z tym, że piszę dużo kodu js w kontrolerze.

zrobiłem niektóre obejście, aby to zrobić za pomocą ng-change, mijając filter i column.name, znajdź kolumnę w tablicy columns, uzyskać własność type, zaktualizuj filter, ale naprawdę myślę, że jest prostsza odpowiedź to.

Odpowiedz

19

Można użyć ng-options związać wybrany obiekt do modelu:

<div class="form-field" ng-repeat="filter in filters"> 
    <select ng-options="column.name for column in columns" ng-model="filter.value"> 
     <option value="" disabled>Choose filter</option> 
    </select> 

    <input type="text" ng-model="filter.value.name"> 
</div> 

Plunker

Aktualizacja odpowiedź:

<div class="form-field" ng-repeat="filter in filters"> 
    <select ng-options="column.name for column in columns" ng-model="filters[$index]"> 
    <option value="" disabled>Choose filter</option> 
    </select> 

    <input type="text" ng-model="filters[$index].name"> 
</div> 
+0

zaktualizowałem że plunker używać 1.1. 5 i nadal działa dobrze. – noj

+0

Hmmm, wierd ... działa na plunkerze, ale nie na mojej lokalnej maszynie. W każdym razie ... dlaczego działa po powiązaniu z 'filter.value', ale nie bezpośrednio na' filter'? Jakoś potrzebuję tej samej struktury co definicja tabeli :) –

+0

Wynika to z zachowania javascript podczas ustawiania wartości w zakresach potomnych. Trzeba to wyjaśnić w komentarzu, więc zobacz [to pytanie] (http://stackoverflow.com/questions/14049480/what-are-the-nuances-of-scope-prototypal-prototypical-inestance-in-angularjs). Aby obejść ten problem, możesz użyć właściwości '$ index' właściwości pętli ng-repeat, aby ustawić wartość. Zobacz zaktualizowany [plunker] (http://plnkr.co/edit/C3ojySE0x6XbDwHkCD7u?p=preview). – noj

Powiązane problemy