How do we import Blockly into an Angular 7 application?

后端 未结 5 1544
囚心锁ツ
囚心锁ツ 2021-01-20 17:50

I\'m trying to use Blockly in an Angular 7 application but I\'m unable to inject the Blockly editor.

I have downloaded the files from https://developers.google.com/b

5条回答
  •  温柔的废话
    2021-01-20 18:49

    I was able to setup with the config mentioned below -

    install blockly with npm -

    npm install git://github.com/google/blockly.git#1.20190419.0
    

    included below files in scripts section of angular.json file -

        "scripts": [
          "node_modules/blockly/blockly_compressed.js",
          "node_modules/blockly/blocks_compressed.js",
          "node_modules/blockly/msg/js/en.js",
          "src/assets/blockly/custom_blocks.js"
        ]
    

    added below lines in my component html file -

      

    angular will throw error at this point saying it does not recognise the blockly tags. So need to use NO_ERRORS_SCHEMA in the module or can represent the toolbar XML as a string in the component TS file and use it to inject blockly.

    my component TS file -

    import { Component, OnInit } from '@angular/core';
    import { ActivatedRoute, Router } from '@angular/router';
    import { ProgramService } from '../services/program.service';
    import { IProgram } from '../models/program';
    
    declare var Blockly: any;
    
    @Component({
      selector: 'app-program-create',
      templateUrl: './program-create.component.html',
      styleUrls: ['./program-create.component.scss']
    })
    export class ProgramCreateComponent implements OnInit {
      title: string;
      programName: string;
      program: IProgram;
      workspace: any;
    
      constructor(
        private route: ActivatedRoute,
        private programService: ProgramService,
        private router: Router
      ) {
        this.title = 'Create Visual Program';
        this.route.params.subscribe(params => {
          this.programName = params['programName'];
          this.program = this.programService.getOne(this.programName);
          if (!this.program) {
            this.program = {
              name: this.programName,
              xmlData: null
            };
          }
          console.log(
            'creating/editing the program - ',
            JSON.stringify(this.program)
          );
        });
      }
    
      ngOnInit() {
        this.workspace = Blockly.inject('blocklyDiv', {
          toolbox: document.getElementById('toolbox'),
          scrollbars: false
        });
    
        if (this.program.xmlData) {
          this.workspace.clear();
          Blockly.Xml.domToWorkspace(
            Blockly.Xml.textToDom(this.program.xmlData),
            this.workspace
          );
        }
      }
    
      saveProgram(): void {
        this.program.xmlData = Blockly.Xml.domToText(
          Blockly.Xml.workspaceToDom(this.workspace)
        );
        console.log('saving the program - ', JSON.stringify(this.program));
        this.programService.upsertOne(this.program);
        this.router.navigate(['listProgram']);
      }
    }
    

    I have written an article explaining this in details here - Integrate Google Blockly with Angular

提交回复
热议问题