2017-02-01 1 views
4

Je veux créer une zone de texte correspondante avec un handstontable, de sorte que la modification de la table a un impact sur le texte, et vice-versa. Voici un JSBin.de déclenchement du cycle condensé dans les événements de rappel

<!DOCTYPE html> 
<html> 
<head> 
    <script src="https://handsontable.github.io/ngHandsontable/node_modules/angular/angular.js"></script> 
    <script src="https://docs.handsontable.com/pro/1.8.2/bower_components/handsontable-pro/dist/handsontable.full.js"></script> 
    <link type="text/css" rel="stylesheet" href="https://docs.handsontable.com/pro/1.8.2/bower_components/handsontable-pro/dist/handsontable.full.min.css"> 
    <script src="https://handsontable.github.io/ngHandsontable/dist/ngHandsontable.js"></script> 
</head> 
<body ng-app="app"> 
    <div ng-controller="Ctrl"> 
     <hot-table settings="settings" on-after-create-row="onAfterCreateRow" datarows="dataJson"></hot-table> 
     <br><br> 
     <textarea cols=40 rows=20 ng-model="dataString"></textarea> 
    </div> 
    <script> 
    var app = angular.module('app', ['ngHandsontable']); 
    app.controller('Ctrl', ['$scope', '$filter', 'hotRegisterer', function ($scope, $filter, hotRegisterer) { 
     $scope.dataJson = [[5, 6], [7, 8]]; 

     $scope.onAfterCreateRow = function (index, amount) { 
      $scope.$digest(); 
     }; 

     $scope.$watch('dataJson', function (dataJson_new) { 
      $scope.dataString = $filter('json')(dataJson_new); 
     }, true); 

     $scope.$watch('dataString', function (dataString_new) { 
      try { 
       $scope.dataJson = JSON.parse(dataString_new); 
      } catch (e) { 
      } 
     }, true); 

     $scope.settings = { 
      contextMenu: true, 
      contextMenuCopyPaste: { 
       swfPath: 'zeroclipboard/dist/ZeroClipboard.swf' 
      } 
     }; 
    }]); 
    </script> 
</body> 
</html> 

Cependant, une chose que je me rends compte que, en ajoutant/suppression de lignes/colonnes ne se déclenche pas le veilleur de dataJSON (alors que la modification d'une valeur de la cellule fera). Je dois donc utiliser $scope.$digest() dans les callbacks tels que onAfterCreateRow pour refléter le changement de l'ajout de lignes. Mais elle soulève Uncaught TypeError: Cannot set property 'forceFullRender' of null:

screen shot 2017-02-01 at 17 07 55

Ayant $scope.$digest() dans d'autres callbacks (à savoir, onAfterCreateCol, onAfterRemoveRow et onAfterRemoveCol) soulèvera la même erreur. Je pense que c'est un problème sérieux, si nous ne pouvons pas déclencher le cycle digest dans ces événements de rappel. Est-ce que quelqu'un sait comment résoudre cela ou avoir une solution de contournement?

Répondre

0

Le $timeout était une solution de contournement dans certaines anciennes versions de moment angulaire, vous pouvez utiliser $applyAsync qui a été créé pour remplacer le délai d'attente de $ comme solution de contournement et de travail pour les cas où vous obtiendriez une erreur $digest already in progress

+0

en effet, '$ scope. $ applyAsync()' fonctionne. Et '$ scope. $ EvalAsync()' fonctionne aussi bien. –

0

Un moyen de résoudre ce problème est d'utiliser le service $timeout qui met en œuvre ce qu'on appelle. Voir ici mis à jour JSBin. En outre, pour voir explication de la façon $timeout fonctionne lire la réponse Here. J'espère que cela aidera.

+0

Il fonctionne, merci vous ... –