2016-07-26 11 views
1

私はこれをng-optionにするのに苦労しています。それも可能ですか?この選択と同じ角度ngオプションは何ですか?

<select ng-model="detail_type_id"> 
    <optgroup ng-repeat="type in data.detailTypes" label="{{type.name}}"> 
     <option ng-repeat="t in type.children" value="{{t.id}}">{{t.name}}</option> 
    </optgroup> 
</select> 

DetailTypes次のようになります。

[ 
{"id":7, 
    "parent_id":null, 
    "name":"Contact", 
    "children":[ 
    {"id":8, 
     "parent_id":7, 
     "name":"Address", 
     "children":[] 
    }, 
    {"id":12, 
     "parent_id":7, 
     "name":"Something else", 
     "children":[] 
    } 
    ]}, 
{"id":16, 
    "parent_id":null, 
    "name":"Other", 
    "children":[ 
    {"id":10, 
     "parent_id":16, 
     "name":"Remarks", 
     "children":[]} 
    ] 
} 
] 

子IDを選択する必要があります。ネスティングは深くすることはできません。

答えて

2

ngOptionsディレクティブは、多次元オブジェクトでは機能しません。したがって、配列を平坦化して使用する必要があります。

<select ng-model="detail_type_id" 
     ng-options="item.id as item.name 
        group by item.groupName for item 
        in data.detailTypes | flatten track by item.id"> 
</select> 

Plunker(フィルター付きバージョン#1):このようなものだ

app.filter('flatten' , function(){ 
    return function(array){ 
    return array.reduce(function(flatten, group){ 
     group.children.forEach(function(child){ 
     child.groupName = group.name; 
     flatten.push(child) 
     }) 
     return flatten; 
    },[]); 
    } 
}) 

とHTML部分: https://plnkr.co/edit/dxi7j8oxInv2VRJ1aL7F

私はそのためのフィルタを書きました

私はあなたのオブジェクトを次のように変更しました:

[{ 
    "id": 7, 
    "parent_id": null, 
    "name": "Contact", 
    "children": [{ 
    "id": 8, 
    "parent_id": 7, 
    "name": "Address", 
    "children": [] 
    }, { 
    "id": 12, 
    "parent_id": 7, 
    "name": "Something else", 
    "children": [] 
    }] 
}, { 
    "id": 16, 
    "parent_id": null, 
    "name": "Other", 
    "children": [{ 
    "id": 10, 
    "parent_id": 16, 
    "name": "Remarks", 
    "children": [] 
    }] 
}] 

EDIT:

提案した後、私はフィルタなしで別のバージョンを書いたが、コントローラ内部でアレイを平坦。

追加コントローラJS:

$scope.flattenDetailTypes = flattenDetailTypes($scope.data.detailTypes); 

    function flattenDetailTypes(array){ 
    return array.reduce(function(flatten, group){ 
     group.children.forEach(function(child){ 
     child.groupName = group.name; 
     flatten.push(child) 
     }) 
     return flatten; 
    },[]); 
    } 

マークアップ:

<select ng-model="detail_type_id" 
     ng-options="item.id as item.name group by item.groupName for item in flattenDetailTypes track by item.id"></select> 

Plunker(フィルタなしバージョン#2): https://plnkr.co/edit/D4APZ6

+0

オブジェクトは少し大きく、翻訳されるため、エラーが発生する可能性があります。質問は、同じ機能を実現するためにと書くことができますか? – icebreaker

+0

ああええ。私はそれを得た。私は試してみます。 –

+1

良い解決策ですが、改良のためにフィルターを使わずにコントローラで一度やり直すことをお勧めします。 – developer033

関連する問題