2016-05-27 24 views
5

Sto usando angularjs 1.5.0 con la griglia ui angolare 3.1.1. Quando assegnare gridOptions (passati alla direttiva griglia) oggetto nel corpo regolatore simili:La griglia ui angolare non mostra il contenuto a meno che la finestra del browser non venga ridimensionata

$scope.gridOptions = { 
     data: [{"mock2": 1, "mock1": 2}, {"mock2": 10, "mock1": 22} ] 
    }; 

HTML:

<div ui-grid="gridOptions"></div> 

Esso mostra la tabella come previsto. Ma quando provo a cambiare i dati all'interno $ scope.on:

$scope.$on('update', function (event, passedFromBroadcast) { 
     $scope.gridOptions.data= [{"mock2": "set", "mock1": "inside"}, {"mock2": "$scope", "mock1": "on"} ] ; 
    }); 

Rende solo struttura del tavolo, quando compresi impaginazione sarà anche rendere i controlli relativi impaginazione - ma non il contenuto stesso. Il contenuto (le intestazioni di righe e colonne) viene visualizzato solo dopo aver ridimensionato la finestra del browser.

  1. Perché non angolare-ui aggiornamento griglia contenuti tavolo quando i dati vengono modificati all'interno di $ scope.on?
  2. Come aggiornare manualmente la tabella della griglia ui angolare? Le cose che mi già provato:

    $scope.gridApi.core.handleWindowResize(); // Does not work 
    $scope.gridApi.core.refresh(); // Does not work 
    $timeout(function(){$scope.gridOptions.data= [{"mock2": "set", "mock1": "inside"}, {"mock2": "$scope", "mock1": "on"} ] ;}) // Does not work 
    
+0

Hese è l'[esempio] (http://ui-grid.info/docs/#/tutorial/112_swapping_data) dei dati di scambio e il [problema] risolto (https://github.com/angular-ui/ui-grid/issues/1302). Funziona per te? –

+0

Ciao Yin, grazie per i link. Il problema riguardava la mancanza degli attributi di larghezza e altezza CSS. C'era anche un ulteriore problema - vedi risposta accettata. –

risposta

2

ci sono due problemi con questo codice, ma il motivo per il contenuto della tabella mostrando solo dopo finestra del browser ridimensionamento è la mancanza di classe CSS larghezza definizione e l'altezza, di base (di lavoro) Esempio:

.grid { 
     width: 500px; 
     height: 250px; 
    } 

e in HTML:

<div class="grid" ui-grid="gridOptions"></div> 

L'altra questione (citato da altre persone in questo discussione:

  • campi assegnando gridOption (dati, ma anche columnDefs) deve essere fatto all'interno $ timeout, inoltre sia i dati che devono essere columnDefs c ho imparato prima.In caso contrario, il cambiamento potrebbe non essere visibile e il contenuto della tabella e le intestazioni rimarranno invariati (bug noto in ui-grid come @maurycy menzionato)
1

Si tratta di un bug noto quando la lunghezza gridOptions.data non cambia dopo l'aggiornamento, la soluzione proposta è quella di cancellare i dati e con l'utilizzo di $ timeout aggiornarlo

$scope.$on('update', function (event, passedFromBroadcast) { 
    $scope.gridOptions.data = null 
    $timeout(function(){ 
    $scope.gridOptions.data = [{"mock2": "set", "mock1": "inside"}, {"mock2": "$scope", "mock1": "on"} ] ; 
    }); 
}); 
+0

Grazie per la tua risposta - Ho paura di non risolverlo, ho ancora bisogno di ridimensionare la finestra del browser per far apparire la tabella. –

+0

hai usato l'angolare '$ timeout'? – maurycy

+0

Ho usato il timeout angolare $. Ho scoperto dov'era il problema - mi mancava la classe CSS che specifica larghezza e altezza ... questo apparentemente ha portato a questo problema di aggiornamento. La cosa di timeout $ era probabilmente un altro problema, ma non quello che causava la visualizzazione diretta della tabella. –

0

si può provare il seguito:

$scope.$on('update', function (event, passedFromBroadcast) { 
    $scope.gridOptions.data.length = 0; 
    $timeout(function(){ 
    $scope.gridOptions.data = [{"mock2": "set", "mock1": "inside"}, {"mock2": "$scope", "mock1": "on"} ] ; 
    }); 
}); 

Spero che questo ha lps!

+0

Grazie, ma non cambia nulla, viene eseguito solo dopo il ridimensionamento manuale del browser. –

1

Mettere il gestore della finestra di ridimensionamento su $interval ha lavorato per me in passato all'interno del metodo gridOptions.onRegisterApi:

var gridResizeHandlerInterval; 

$scope.gridOptions = { 
    ..., // etc. 
    onRegisterApi: function(gridApi) { 
    ctrl.gridApi = gridApi; 

    gridResizeHandlerInterval = $interval(function() { 
     $scope.gridApi.core.handleWindowResize(); 
    }, 10, 500); 
    } 
}; 

E quindi assicuratevi di riordinare e annullare l'intervallo, quando il controller viene distrutta:

$scope.$on('$destroy', function() { 
    $interval.cancel(gridResizeHandlerInterval); 
}); 

Spero che questo ti aiuta ...

+0

Grazie! Anche se non risolve questo particolare problema, è stato comunque molto utile. È importante utilizzare gridApi.core.handleWindowResize(); nel prossimo digest dopo ogni aggiornamento a width, columnDefs o dati. il timeout può essere usato per quello - anche l'intervallo funzionerà ma è più che sufficiente, una chiamata a gridApi.core.handleWindowResize(); è sufficiente. –

Problemi correlati