Comment ajouter des conditions lors de l'affichage de données dans ui-grid
cellTemplate ci-dessous:
$scope.status = ['Active', 'Non Active', 'Deleted'];
$scope.gridOptions = {
columnDefs: [{
field: 'code'
}, {
field: 'name'
}, {
field: 'status',
cellTemplate: '<div>{{status[row.entity.status]}}</div>'
}]
};
Le résultat attendu doit être l'état de la ligne show Active/NonActive/Deleted
.
Voici le plunker
Merci d'avance.
Vous devez utiliser externalScopes
.
Dans votre balisage, définissez le détenteur de la grille comme ceci.
<div ui-grid="gridOptions" external-scopes="states" class="grid"></div>
Et dans votre contrôleur utilisez ce code:
var statusTxt = ['Active', 'Non Active', 'Deleted'];
$scope.states = {
showMe: function(val) {
return statusTxt[val];
}
};
var statusTemplate = '<div>{{getExternalScopes().showMe(row.entity.status)}}</div>';
$scope.gridOptions = {
columnDefs: [{
field: 'code'
}, {
field: 'name'
}, {
field: 'status',
cellTemplate: statusTemplate
}]
};
Ou utilisez un filtre angulaire.
Notez que ceci ne rend que rend le texte. La meilleure approche serait de transformer myData
pour avoir des états de texte réels avant de l’utiliser dans ui-grid. Juste au cas où vous souhaiteriez effectuer ultérieurement un filtrage textuel.
Voici un Plunker
Je suggérerais d'utiliser ng-if
pour résoudre ce problème.
$scope.gridOptions = {
columnDefs: [{
field: 'code'
}, {
field: 'name'
}, {
field: 'status',
cellTemplate: '<div ng-if="row.entity.status == 0">Active</div><div ng-if="row.entity.status == 1">Non Active</div>'
}]
};
J'ai une autre solution pour vous sans utiliser d'étendues externes:
Le modèle ressemble à ceci:
var statusTemplate = '<div>{{COL_FIELD == 0 ? "Active" : (COL_FIELD == 1 ? "Non Active" : "Deleted")}}</div>';
Voici le plunker:
Utilisez une cellFilter
.
columnDefs: [{
field: 'code'
}, {
field: 'name'
}, {
field: 'status',
cellFilter: 'mapStatus'
}]
app.filter('mapStatus', function() {
var statusMap = ['Active', 'Non Active', 'Deleted'];
return function(code) {
if (!angular.isDefined(code) || code < 0 || code > 2) {
return '';
} else {
return statusMap[code];
}
};
});
Vous devez changer votre modèle. Lorsque vous faites référence à des portées externes dans angular-ui-grid, vous pouvez utiliser grid.appScope.
var statusTemplate = '<div>{{grid.appScope.status[row.entity.status]}}</div>';
Essayez ci-dessous script. Ça marche pour moi.
app.controller('MainCtrl', ['$scope',
function($scope) {
var statusTxt = ['Active', 'Non Active', 'Deleted'];
$scope.showMe= function(val) {
return statusTxt[val];
};
var statusTemplate = '<div>{{grid.appScope.showMe(row.entity.status)}}</div>';
$scope.gridOptions = {
columnDefs: [{
field: 'code'
}, {
field: 'name'
}, {
field: 'status',
cellTemplate: statusTemplate
}]
};
$scope.gridOptions.data = [{
"code": "Cox",
"name": "Carney",
"status": 0
}, {
"code": "Lorraine",
"name": "Wise",
"status": 1
}, {
"code": "Nancy",
"name": "Waters",
"status": 2
}];
}
]);