Как создать класс с анонимными функциями в Angular8 - PullRequest
0 голосов
/ 30 сентября 2019

Я занимаюсь разработкой приложения Angular 8 и мне нужна библиотека для отображения 3D-моделей (JS + WASM). Для взаимодействия между Моей Таблицей Дерева и 3D-моделью мне нужно зарегистрировать наблюдателя в этой библиотеке.

Данный пример кода для регистрации наблюдателя (для этой библиотеки) написан на AngularJS:

Регистрация:

$scope.RegisterSelectionObserver = function() {
    if ($scope.selectionObserver == null) {
        $scope.selectionObserver = new $scope.MySelectionClass();
        $scope.session.RegisterSelectionObserver($scope.selectionObserver);
    }
}

Определение класса:

$scope.MySelectionClass = Module.SelectionEvents.extend("SelectionEvents", {
        __construct: function() {
            this.__parent.__construct.call(this);
            this.SetEventsFilter(Module.EVENTS_PICKS | Module.EVENTS_SELECTION);
        },

        OnSelectionBegin: function () {
            if ($scope.webglSettings.selectionLogging === 'YES') {
                console.log("OnSelectionBegin");
            }
        },
     });

Мое усыновление: Я пытался создатьКласс с его конструктором и передать его на регистрацию наблюдателя, с ошибкой.

Мой пользовательский класс:

export class ExtSelectionEvents{
    constructor(){
    }

    OnSelectionBegin(){
        console.log('OnSelectionBegin');
    }
}

Моя регистрация:

const extSelectionEventsInstance = new ExtSelectionEvents();
session.RegisterSelectionObserver(extSelectionEventsInstance);

Ошибка:

zone.js: 703 Необработанный отказ от обещания: Невозможно передать «[объект объекта]» в качестве объекта SelectionEvents *;Зона:;Задача: Promise.then;Значение: BindingError {name: "BindingError", сообщение: "Невозможно передать" [объект объекта] "в качестве SelectionEvents *", стек: "BindingError: Невозможно передать" [объект объекта] "в качестве S… eferences (http://localhost:4200/scripts.js:181:13)"}message: «Невозможно передать« [объект объекта] »в качестве SelectionEvents *» имя: стек «BindingError»: «BindingError: Невозможно передать« [объект объекта] »в качестве SelectionEvents * ↵
в BindingError. (http://localhost:4200/assets/js/libthingview_wasm.js:1:117337)↵
в новом BindingError (eval в createNamedFunction (http://localhost:4200/assets/js/libthingview_wasm.js:1:116224),: 4: 34) ↵ в throwBindingError (http://localhost:4200/assets/js/libthingview_wasm.js:1:118918)↵ в RegisteredPointer.nonConstNoSmartPtrRawPointerToWireType [as toWireType] 1046 * в сеансе $ RegisterSelectionObserver [в качестве RegisterSelectionObserver] (eval at new_ (http://localhost:4200/assets/js/libthingview_wasm.js:1:142970),: 8: 26) ↵ в OverviewComponent.push ../ src / app / views / mechportal / Overview/view.component.ts. OverviewComponent.callback (http://localhost:4200/views-mechportal-overview-overview-module.js:18109:17)↵ в http://localhost:4200/scripts.js:18:31↵ в http://localhost:4200/scripts.js:182:17↵ в _loadPreferences (http://localhost:4200/scripts.js:304:9)↵ в Object.LoadPreferences (http://localhost:4200/scripts.js:181:13)"proto: Ошибка BindingError: Cannot pass "[объект объекта] "как SelectionEvents * в BindingError. (http://localhost:4200/assets/js/libthingview_wasm.js:1:117337) при новой ошибке BindingError (eval at createNamedFunction (http://localhost:4200/assets/js/libthingview_wasm.js:1:116224),: 4: 34)

Резюме:

TheБиблиотека ожидает анонимную функцию для OnSelectionBegin, потому что она создает ее именованную функцию.

Что происходит в MySelectionClass и как я могу перевести определение класса AngularJS с его анонимной функцией для работы с Angular 8 /библиотека

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Класс SelectionEvents был отсутствующим миром.

После глобальной делкарации модуля (объявляем var Module: any) я наконец-то смог расширить класс SelectionEvents и реализовать мои методы.

Единственная разница между реализациями Angular и AngularJS заключалась в разных областях применения. В AngularJS он был привязан к области действия контроллера и теперь находится в глобальной области видимости.

   const MyEventsClass = Module.SelectionEvents.extend("SelectionEvents", {

  __construct: function () {
    this.__parent.__construct.call(this);
    this.SetEventsFilter(Module.EVENTS_PICKS | Module.EVENTS_SELECTION);
  },

  OnSelectionBegin: function () {
      console.log("OnSelectionBegin");
      console.dir(this);
  }
});

session.RegisterSelectionObserver(new MyEventsClass());
0 голосов
/ 30 сентября 2019

Не уверен в этом, но вы должны справиться с классом JS:

export class ExtSelectionEvents extends SelectionEvents{
    constructor() {
      super();
    }

    OnSelectionBegin(){
        console.log('OnSelectionBegin');
    }
}
...