Новый конструктор функций в Angular, как ссылаться на импортированные скрипты в ожившем объекте - PullRequest
1 голос
/ 26 мая 2019

У меня есть json с функцией, хранящейся в нем как строки, и когда я возрождаю его с помощью новой функции и пытаюсь использовать метод, который использует библиотеку, импортированную с помощью angular, например lodash, я получаю ошибку ссылки. Вот код, который ZombieLoader восстановит объект json, и в тесте углового класса попытается запустить его, я получу ошибку _ не найдено.

// This class takes a json and produces an object with methods
export class ZombieLoader {
  static revive(st: string): object {
    const result = {};
    const obj = JSON.parse(st);
    for (const key of Object.keys(obj)) {
      if (key.startsWith('@')) {
        result[key.substring(1)] = new Function('return ' + obj[key])();
        continue;
      }
      result[key] = obj[key];
    }
    return result;
  }
}

// the json with function in string form that will be hydrated back for use
{
script: '{"@run":"function () { return _.chunk(['a', 'b', 'c', 'd'], 2); };}'
}  


// here I test the method which fails because it cant find _ 
import * as _ from 'lodash';
import {ZombieLoader} from './zombie-loader';

export class Test {
    constructor(script: string) {
         const sceneScript = ZombieLoader.revive(script);
         sceneScript.run();
    }
}

Почему реконструированный объект не имеет ссылки на загруженные в Angular скрипты, есть способ восстановить объект и связать его с угловым. Если я добавлю lodash в файл index.html, он будет работать, но я не хочу делать это с несколькими другими библиотеками

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Добавляя () в конце - new Function('return ' + obj[key])(), вы выполняете функцию, и она не может знать о каких-либо зависимостях своего вызывающего.

Я не знаю, что run() делает здесь sceneScript.run();, но конструктор Function принимает параметры аргументов, так что вы можете просто передать необходимую зависимость: new Function('_', 'return ' + obj[key]); и позже вызвать функции, передав ее из вызывающей программы:

sceneScript.run(_);
0 голосов
/ 26 мая 2019

Кажется, что _ библиотека не загружается Angular, потому что она не используется напрямую во время создания компонента. Небольшое решение, попробуйте использовать _ библиотеку в конструкторе или Oninit, как это console.log(typeof _ ); чем вы не получите ссылку ссылку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...