Search code examples
angularjshandsontable

Create a handsontable in ng-switch


I would like to use a handsontable inside a ng-switch: when we select handsontable, it shows a normal and editable handsontable.

JSBin

HTML:

<!DOCTYPE html>
<html>
<head>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
  <script src="https://docs.handsontable.com/pro/1.8.2/bower_components/handsontable-pro/dist/handsontable.full.min.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">
</head>
<body ng-app="">
  <select ng-model="myVar">
    <option value="dogs">Dogs
    <option value="handsontable">handsontable
  </select>

  <div ng-switch="myVar">
    <div ng-switch-when="dogs">
     <p>Welcome to a world of dogs.</p>
    </div>
    <div ng-switch-when="handsontable">
      <div id="example1" class="hot handsontable htRowHeaders htColumnHeaders"></div>
    </div>
  </div>
</body>
</html>

JavaScript:

var example1 = document.getElementById('example1');
var settings1 = { data: [['A1', 'B1'], ['A2', 'B2']] };
var hot1 = new Handsontable(example1, settings1);

Unlike this working example, the cells in the table are NOT editable. So I am wondering if there is something missing. For example in the working example, the creation of the table is wrapped by document.addEventListener("DOMContentLoaded", function() { ... }), should I wrap the javascript code in this example by something to make sure we create the table only after we ng-switch to handsontable?


Solution

  • So as @Mistailis suggested, we could use ngHandsontable.

    JSBin

    HTML:

    <!DOCTYPE html>
    <html>
    <head>
      <base href="http://handsontable.github.io/ngHandsontable/node_modules/">
      <link rel="stylesheet" href="handsontable/dist/handsontable.full.css">
      <script src="angular/angular.js"></script>
      <script src="handsontable/dist/handsontable.full.js"></script>
      <script src="../dist/ngHandsontable.js"></script>
    </head>
    <body ng-app="app">
      <select ng-model="myVar">
        <option value="dogs">Dogs
        <option value="handsontable">handsontable
      </select>
    
      <div ng-switch="myVar">
        <div ng-switch-when="dogs">
         <p>Welcome to a world of dogs.</p>
        </div>
        <div ng-switch-when="handsontable">
          <div ng-controller="MainCtrl as ctrl">
            <hot-table datarows="ctrl.db.items"></hot-table>
          </div>
        </div>
      </div>
    </body>
    </html>
    

    JavaScript:

    function dataFactory () { };
    dataFactory.$inject = [];
    angular.module('ngHandsontable').service('dataFactory', dataFactory);
    
    function MainCtrl(dataFctory) {
      this.db = { items: [[5, 6], [7, 8]] };
    }
    MainCtrl.$inject = ['dataFactory'];
    
    angular
      .module('app', ['ngHandsontable'])
      .controller('MainCtrl', MainCtrl);