J'ai une vue dans une application angularjs dans laquelle je veux permettre à l'utilisateur de choisir entre différentes grilles configurées différemment. Idéalement, j'aimerais lier la valeur transmise à la directive ng-grid à une variable de modèle, comme illustré ci-dessous. Cependant, bien que cet exemple rend le balisage qui fonctionne lorsqu'une simple valeur de chaîne est transmise à ng-grid (c'est-à-dire <div class="gridStyle" ng-grid="gridOptions1"></div>
, la configuration dynamique échoue.
var app = angular.module('myApp', ['ngGrid']);
app.controller('MyCtrl', function($scope) {
$scope.option;
$scope.myData = [{name: "Moroni", age: 50},
{name: "Tiancum", age: 43},
{name: "Jacob", age: 27},
{name: "Nephi", age: 29},
{name: "Enos", age: 34}];
$scope.gridOptions1 = { data: 'myData',
columnDefs: [{ field:"name", displayName: "NAME"},
{ field:"age", displayName: "AGE"}],
multiSelect: true };
$scope.gridOptions2 = { data: 'myData',
columnDefs: [{ field:"name", displayName: "Name"},
{ field:"age", displayName: "Age"}],
multiSelect: false };
});
<body ng-controller="MyCtrl">
<label>Show me:</label>
<input type="radio" name="option" ng-model="option" value="gridOptions1">Grid A</input>
<input type="radio" name="option" ng-model="option" value="gridOptions2">Grid B</input>
<div class="gridStyle" ng-grid="{{option}}"></div>
</body>
Quelqu'un peut-il me dire s'il vous plaît s'il existe un moyen de faire en sorte que ng-grid accepte une configuration différente de manière dynamique, ou s'il existe une solution de contournement à cette limitation? Veuillez noter que je dois reconfigurer plusieurs propriétés de la grille, pas seulement les propriétés columnDefs
et data
, pour lesquelles je pense qu'il existe des solutions de contournement.
J'ai trouvé une bonne solution à cela sur le forum angulaire . Essentiellement, si un tableau d'objets de configuration est maintenu, des éléments individuels peuvent être passés à la directive ng-grid comme dans le balisage ci-dessus. Plunker illustrant la solution ici: http://plnkr.co/edit/TDGKRo?p=preview
var gridOptions1 = {
data: 'myData',
columnDefs: [
{ field:"name", displayName: "NAME"},
{ field:"age", displayName: "AGE"}],
multiSelect: true,
selectedItems: $scope.selected
};
var gridOptions2 = {
data: 'myData',
columnDefs: [
{ field:"name", displayName: "Name"},
{ field:"age", displayName: "Age"}],
multiSelect: false,
selectedItems: $scope.selected
};
$scope.filterTabs = [{grid: gridOptions1}, {grid: gridOptions2}];
<ol>
<li ng-repeat="tab in filterTabs">
<div class="gridStyle" ng-grid="tab.grid"></div>
</li>
</ol>
Il semble que vous puissiez le faire si vous affectez columnDefs
à une chaîne d'une propriété sur le $scope
, puis modifiez le tableau: http://plnkr.co/edit/wuob1M?p=preview ;
Il est décrit dans ce problème soulevé sur ng-grid.
JS:
var app = angular.module('myApp', ['ngGrid']);
app.controller('MyCtrl', function($scope) {
$scope.myData = [{name: "Moroni", age: 50},
{name: "Tiancum", age: 43},
{name: "Jacob", age: 27},
{name: "Nephi", age: 29},
{name: "Enos", age: 34}];
$scope.columnDefs1 = [{ field:"name", displayName: "NAME"},
{ field:"age", displayName: "AGE"}];
$scope.columnDefs2 = [{ field:"name", displayName: "Name"},
{ field:"age", displayName: "Age"}];
$scope.gridOptions = { data: 'myData',
columnDefs: 'columnDefs1',
multiSelect: true };
$scope.switchColumnDefs = function() {
$scope.columnDefs1 = $scope.columnDefs2;
}
});
HTML:
<body ng-controller="MyCtrl">
<label>Show me:</label>
<a ng-click="switchColumnDefs()">Switch Options</a>
<div class="gridStyle" ng-grid="gridOptions"></div>
</body>
Je pensais juste que je dirais que si quelqu'un est intéressé à passer de Single Select à MultiSelect, cela peut se faire de manière dynamique, comme ceci:
$gridScope.selectionProvider.multi = true / false;
Une autre façon de faire est simplement de coller quelque chose comme:
<div ng-grid="gridOptions" ng-if="refresh"></div>
Ensuite, désactivez l'actualisation, mettez à jour la configuration de la grille, puis réactivez-le dans deux cycles d'actualisation différents.
Il est possible que le pilote que j’ai édité pour vous:Here
Veuillez noter que lorsque je joue avec, pas toutes les options où live rafraîchissant ... Mais certaines où, comme vous pouvez le voir dans l'exemple.
Fondamentalement, la solution consiste à attribuer des variables $ scope aux paramètres de gridOptions.