Хотя эта тема уже обсуждалась в других постах, как это:Машинопись и угловые 2 Отражение
Dynamically loading a typescript class (reflection for typescript)
Я не смог найти ответа на мой конкретный вопрос. Итак, простите меня, если это дублируется.
Я пытаюсь создать очень простую директиву в Angular 2 (используя машинопись), которая позволяет динамически добавлять или удалять набор элементов управления, представленных типом. Например, если тип:
class Stone{
constructor(
public nameOfStone?: string,
public typeOfStone?: string
){}
}
пользовательский интерфейс будет иметь что-то вроде этого:
Я могу получить эту работу с определенного типа (например: камень). Но, учитывая, что целью директивы является просто добавить эту динамическую функцию добавления/удаления, я почувствовал, что имеет смысл параметризовать создаваемый тип и использовать его для разных определений типов. Я пытался что-то вроде этого в компоненте класса:
import {Component} from 'angular2/core';
import {NgForm} from 'angular2/common';
import {ControlGroup, Control, FormBuilder, FORM_DIRECTIVES} from 'angular2/common'
@Component({
selector: 'stone-details',
templateUrl: '../stones/stone-details.component.html',
directives: [FORM_DIRECTIVES]
})
export class StoneComponent {
type = 'Stone';
Stones = new Array<Stone>();
addBtnClicked(){
let Stone = Object.create(window['Stone'].prototype);
//let Stone = new Stone('', '');
this.Stones.push(Stone);
}
removeBtnClicked(index: number){
if(index >= this.Stones.length){
alert('Not a valid index');
}else if(confirm('Remove this Stone?')){
this.Stones.splice(index, 1);
}
}
}
class Stone{
constructor(
public nameOfDeity?: string,
public typeOfDeity?: string
){}
}
Когда я использую комментируемой строке let Stone = new Stone('', '');
компонент работает отлично, но если я использую let Stone = Object.create(window['Stone'].prototype);
это не похоже на работу и ошибку я вижу есть angular2.dev.js:23941 ORIGINAL EXCEPTION: TypeError: Cannot read property 'prototype' of undefined
.
Первоначально я думал, что экспорт камня класса поможет, но ни одна из сумасшедших вариаций (экспорт класса, пытаясь ссылаться на класс как окно ['StoneComponent']. Export_1 ['Stone']). Я понимаю, что компонент не отображается непосредственно под компонентом окна, но я не уверен, что мне не хватает. Есть ли альтернативный способ сделать это? Я что-то упускаю? Пожалуйста, порекомендуйте.
P.S: Я использую последнюю версию Angular 2 и Typcript (я запустил это приложение на пару дней назад).
does 'Object.create (Stone.prototype)' не работает? – jpopesculian
Это так, но я не могу сделать его динамичным. То есть Object.create (Stone.prototype) работает, что не сильно отличается от Stone = new Stone(); Но я не могу использовать переменную вместо типа Stone, например: Object.create ( .prototype) –
user1452030
Это сложно, потому что трудно узнать, что такое родительский объект. Это не окно, я думаю. Вы пробовали это? В противном случае вы можете создать собственный словарь возможных прототипов, а затем получить доступ к прототипам через этот словарь (кажется достаточно безопасным, вам просто нужно его поддерживать). В противном случае, попробуйте 'eval (« Stone »)'? Чувствует себя супер грязным, хотя – jpopesculian