私は以下をコーディングしました:
$scope.gridOptions = {
data: 'myData',
enableCellEdit: true,
multiSelect: false,
columnDefs: [
{ field: 'Id', displayName: 'Id' },
{ field: 'Name', displayName: 'Name', enableCellEdit: true, editableCellTemplate: cellEditableTemplate },
{ field: 'Description', displayName: 'Description', enableCellEdit: true, editableCellTemplate: cellEditableTemplate }
]
};
MyDataには、実際には4つの列ID、名前、ステータス、および説明が含まれています。ここで、statusは、myStatusと呼ばれる3種類のステータスを持つ単純なJavaScript配列です。
MyStatusのデータをng-gridのフィールドにリンクして、選択ドロップダウンから新しい値を選択できるようにすることはできますか?
これがいくつかの実験の出力です。
http://plnkr.co/edit/W1TkRgsp0klhqquxaiyc?p=preview
セルテンプレートにselect
を入れることができるようです。また、row
オブジェクトを使用して、必要なものを取得できます。元のデータへのプロパティアクセスにrow.rowIndex
を使用しました。
テンプレートの例:
<div>
<select ng-model="myData[ row.rowIndex ].myStatus">
<option ng-repeat="st in statuses">{{st}}</option>
</select>
</div>
(row
オブジェクトを介して元のデータに書き込むことができれば便利です。方法はわかりません。)
Tosh shimayamaのやり方では、モデル配列以外の順序でテーブルを並べ替えることはできません。
これはちょっと醜い方法ですが、ng-gridのソースコードをざっと見てみると、正規表現を使用してng-modelを挿入していることがわかりました。したがって、同じ変数COL_FIELDをコードで使用することにより、ng-gridに正しいモデルを挿入させることができます。
<div>
<select ng-model="COL_FIELD">
<option ng-repeat="status in statuses">{{status}}</option>
</select>
</div>
実例のあるプランカーは次のとおりです。 http://plnkr.co/edit/Yj2qmI?p=preview
Ng-grid 2.xでこれを行うためのより完全でよりきちんとした方法ここでプランカーに含めました: http://plnkr.co/edit/VABAEu?p=preview 、コンテンツを活用ここでのstackoverflowに関する別の同様の質問から: AngularJSおよびng-grid-セルが変更された後、サーバーにデータを自動保存します
要約すると、編集可能なフィールドテンプレートのフォーマットは次のようになります。
$scope.statuses = {1: 'active', 2: 'inactive'};
$scope.cellSelectEditableTemplate = '<select ng-class="\'colt\' + col.index"
ng-input="COL_FIELD" ng-model="COL_FIELD"
ng-options="id as name for (id, name) in statuses"
ng-blur="updateEntity(row)" />';
エンドツーエンドコードのより完全なウォークスルーを含むブログ投稿を提供しました: http://technpol.wordpress.com/2013/12/06/editable-nggrid-with-both-ドロップダウンと選択/
Ng-grid(ui-grid)3.0はリリース間近であり、編集可能なグリッドを作成するためのさまざまな方法を提供します。ここに投稿があります: http://technpol.wordpress.com/2014/08/23/upgrading-to-ng-grid-3-0-ui-grid/
ソリューション全体を信用することはできません。ピースをまとめるだけです。私の目標は、3方向のバインディングを維持することでした。
テンプレートは次のようになります。
$scope.cellSelectEditableTemplate = '<select ng-class="\'colt\' + col.index" ng-input="COL_FIELD" ng-model="COL_FIELD" ng-options="value.id as value.label for value in OptionsList}" />';
変更をネイティブにキャプチャできます。
$scope.$on('ngGridEventEndCellEdit', function (evt) {
console.log(evt.targetScope.row.entity);
WaitListArray.$save(evt.targetScope.row.entity)
.then(function (ref) {
console.log('saved');
});
});
この場合、WaitListArrayはテーブルのFirebase/AngularFire配列です。この方法を使用して、ツリーウェイバインディングを保持することができました。
フィールド(ng-options):
{
field: 'status',
displayName: 'Status',
enableCellEditOnFocus: true,
editableCellTemplate: $scope.cellSelectEditableTemplate,
cellFilter: 'mapStatus:OptionsList'
}
ドロップダウン値のidをlabelに置き換えるフィルターを追加しました。
.filter('mapStatus', function() {
return function(input, OptionsList) {
var _out = 'unknown';
angular.forEach(OptionsList, function(value, key) {
if (value && value.id == input) {
_out = value.label;
}
});
return _out;
};
})
上記では、OptionsListはドロップダウン値の配列の例です:{id:1、label: "label1"}
このソリューションは非常に再利用可能であることがわかりました。うまくいけば、それは誰かのために時間を節約します。