Как мы импортируем Blockly в приложение Angular 7? - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь использовать Blockly в приложении Angular 7, но не могу добавить редактор Blockly.

Я скачал файлы из https://developers.google.com/blockly/guides/get-started/web и скопировал blockly_compressed.js вмой каталог src (и переименовал его в blockly.js).Затем я пытаюсь получить доступ к Blockly из моего компонента и получить ошибки.

Что я пробовал:

import "../blockly.js"

Не компилируется, выдает«ошибка TS2304: не удается найти имя« Blockly ».»

import { Blockly } from '../blockly'

компилируется, но выдает следующую ошибку при открытии приложения в браузере:

ERROR TypeError: _blockly__WEBPACK_IMPORTED_MODULE_4__.Blockly.inject is not a function

Добавление блочно.Файл d.ts со следующим:

export namespace Blockly {
    export function inject(div: string, config: any): void;
}

Выдает ту же ошибку, что и выше.

Любые предложения о том, что еще я мог бы попробовать?

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Я предполагаю, что вы используете @ angular / cli.

Демонстрация

Шаг 1: Установите блочно

npm install blockly

Шаг 2:Добавьте сценарии в angular.json под узлом архитектора:

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

Шаг 3: Добавьте NO_ERRORS_SCHEMA в свой AppModule (чтобы вы могли определять пользовательские теги в ваших компонентах)

@NgModule({
  imports:      [ BrowserModule, AppRoutingModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ],
  exports: [AppComponent],
  schemas: [NO_ERRORS_SCHEMA]
})
export class AppModule {
}

Шаг 4. Создайте компонент, объявите Blockly как any и внедрите AfterViewInit, чтобы вы могли получить доступ к элементам, связанным с блоками, в DOM:

import { Component, AfterViewInit, ViewChild, ElementRef } from '@angular/core';
declare var Blockly: any;

@Component({
  selector: 'app-root',
  template: `
    <div id="blocklyDiv" style="height: 480px; width: 600px;"></div>
    <xml id="toolbox" #toolbox style="display: none">
            <block type="controls_if"></block>
            <block type="logic_compare"></block>
            <block type="controls_repeat_ext"></block>
            <block type="math_number"></block>
            <block type="math_arithmetic"></block>
            <block type="text"></block>
            <block type="text_print"></block>
    </xml>
  `
})
export class AppComponent implements AfterViewInit {
  workspace: any;
  @ViewChild('toolbox') toolbox: ElementRef;

  ngAfterViewInit(): void {
    this.workspace = Blockly.inject('blocklyDiv',
    {toolbox: this.toolbox.nativeElement });
  }
}

ПРИМЕЧАНИЕ. Пакет Blocklyв NPM v1.0, а последняя версия v1.2.Чтобы использовать последнюю версию, просто загрузите библиотеку, поместите ее в известный каталог и исправьте ссылки на сценарии (шаг 2).

0 голосов
/ 23 июля 2019

Мне удалось настроить с помощью указанного ниже конфига -

установить блочно с помощью npm -

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

, включенных в файлы ниже, в разделе скриптов файла angular.json -

    "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"
    ]

добавлено ниже строк в html-файле моего компонента -

  <div id="blocklyDiv" style="width: 100%; height: 100%"></div>
  <xml id="toolbox" style="display: none">
    <category name="Control" colour="120">
      <block type="controls_if"></block>
      <block type="controls_repeat_ext" disabled="true"></block>
    </category>
    <category name="Text" colour="230">
      <block type="text"></block>
      <block type="text_print"></block>
    </category>
    <category name="Custom" colour="360">
      <block type="begin"></block>
      <block type="move"></block>
      <block type="end"></block>
    </category>
  </xml>

angular выдаст ошибку на этом этапе, сказав, что не распознает блочные теги.Поэтому необходимо использовать NO_ERRORS_SCHEMA в модуле или можно представить XML панели инструментов в виде строки в файле компонента TS и использовать его для блочного внедрения.

мой файл компонента TS -

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написал статью, подробно объясняющую это здесь - Интеграция Google Blockly с Angular

0 голосов
/ 22 октября 2018

Вы должны сначала добавить его к angular.json.Так что угловой CLI может его построить.

        "scripts": [
          "../blockly.js"
        ]
...