动态组件加载-将组件作为变量获取

如何解决动态组件加载-将组件作为变量获取

我正在Angular中实现一个相对复杂的component loader,并且我想从rxjs存储中动态获取组件实例。

loadEditAreaComponent(component: any,componentInstanceData?: {}){
    const componentFactory = this.cfr.resolveComponentFactory(component);
    const viewContainerRef = this.editAreaHost.viewContainerRef;
    const componentRef = viewContainerRef.createComponent(componentFactory);
    Object.keys(componentInstanceData).forEach(key => {
      componentRef.instance[key] = componentInstanceData[key];
})

有效。但是,我觉得any在这里有点草率。我似乎找不到正确的类型。

resolveComponentFactory的签名是 (method) ComponentFactoryResolver.resolveComponentFactory<unkNown>(component: Type<unkNown>): ComponentFactory<unkNown>

当我说component: Type时,我得到: Argument of type 'Type' is not assignable to parameter of type 'Type<unkNown>'.

当我说component: Type<unkNown>Type<any>时,我得到: Type 'Type' is not generic.

不胜感激,也希望获得一些有关Typescript约束的背景知识,我可能无法理解。

谢谢!

解决方法

resolveComponentFactory方法的签名如下:

export const PlacementsForm = () => {
  const [placementData,setPlacementData] = useState([
    { key: 1,name: 'Long side panel',value: 10 },{ key: 2,name: 'Custom wrap',value: 0 },{ key: 3,name: 'Seatback',{ key: 4,name: 'Full wrap',value: 20 },{ key: 5,name: 'Driver’s cabin',{ key: 6,name: 'Stop side panel',{ key: 7,name: 'Max Parade',value: 60 },{ key: 8,name: 'Parade',{ key: 9,name: 'Full rear',value: 70 },{ key: 10,name: 'Rear panel',]);

  const handleSliderChange = (event) => {
    setPlacementData({
      ...placementData,[event.target.name]: event.target.value,});
  };

  const handleInputChange = (event,idx) => {
    const usedSlider = event.target;
    setPlacementData(() => placementData.map((item,i) => usedSlider.value));
  };

  //   const handleInputChange = (event) => {
  //     setPlacementData(
  //       event.target.value === '' ? '' : Number(event.target.value)
  //     );
  //   };

  //   const handleSliderChange = (name) => (event) => {
  //     // placementData[index] = event.target.value;
  //     // setPlacementData([...placementData]);
  //     setPlacementData({ [name]: event.target.value });
  //   };

  //   const handleInputChange = (name) => (event,value) => {
  //     // placementData[index].value = event.target.value;
  //     // setPlacementData([...placementData]);
  //     setPlacementData({ [name]: value });
  //   };

  console.log('placementData',placementData);

  return (
    <SliderContainer>
      <Grid>
        <Row>
          {placementData.map((option) => (
            <Col xs={6} md={6} key={option.name}>
              <SliderTitle>{option.name}</SliderTitle>
              <SliderItem key={option.key}>
                <MatGrid item xs>
                  <Slider
                    value={typeof option.value === 'number' ? option.value : 0}
                    onChange={handleSliderChange}
                    aria-labelledby="input-slider"
                    valueLabelDisplay="auto"
                  />
                </MatGrid>
                <MatGrid item>
                  <Input
                    name={option.name}
                    style={{ width: '50px',paddingLeft: 15 }}
                    value={option.value}
                    margin="dense"
                    onChange={handleInputChange}
                    // onBlur={handleBlur}
                    inputProps={{
                      step: 10,min: 0,max: 100,type: 'number','aria-labelledby': 'input-slider',}}
                  />
                </MatGrid>
              </SliderItem>
            </Col>
          ))}
        </Row>
      </Grid>
    </SliderContainer>
  );
};

您应该使用相同的类型:

abstract resolveComponentFactory<T>(component: Type<T>): ComponentFactory<T>;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?