【问题标题】:Angular2 (click) load dynamically the component viewAngular2(点击)动态加载组件视图
【发布时间】:2017-08-10 08:52:27
【问题描述】:

我创建了单击以动态加载组件视图,但每次单击都是单独的。我想要一个函数,我通过函数传递一个字符串,而不是在我的函数中输入该字符串来加载视图。

这是一个工作中的笨蛋 http://plnkr.co/edit/ZXsIWykqKZi5r75VMtw2?p=preview

组件

@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2>Lets dynamically create some components!</h2>
      <button (click)="createHelloWorldComponent()">Create Hello World</button>
      <button (click)="createWorldHelloComponent()">Create World Hello</button>
      <dynamic-component [componentData]="componentData"></dynamic-component>
    </div>
  `,
})

export class App {
  componentData = null;

  createHelloWorldComponent(){

    this.componentData = {
      component: HelloWorldComponent,
      inputs: {
        showNum: 9
      }
    };
  }

  createWorldHelloComponent(){
    this.componentData = {
      component: WorldHelloComponent,
      inputs: {
        showNum: 2
      }
    };
  }
}

想要的是一个函数,并从数组中定义一个变量,该变量在(点击)中传递并加载视图。 这是一个尝试的 plunker: http://plnkr.co/edit/HRKGhCCEfkOhNjXbr6C5?p=preview

@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2>Lets dynamically create some components!</h2>

          <li *ngFor="let item of myMenu">

              <button (click)="loadView({{ item.viewname }})">{{ item.id }}</button>
         </li>

      <dynamic-component [componentData]="componentData"></dynamic-component>
    </div>
  `,
})
export class App {
  componentData = null;
   myMenu = {};
      constructor() {
        this.myMenu = myMenu;

      }

  loadView(viewName){

    this.componentData = {
      component: viewName,
      inputs: {
        showNum: 9
      }
    };
  }


}

const myMenu = [
    {
     id: 1, 
    viewname: 'HelloWorldComponent'
    },
    {
     id: 2, 
     viewname: 'WorldHelloComponent'

    },


];

【问题讨论】:

    标签: angular dynamic


    【解决方案1】:

    使用下面的代码,

    @Component({
      selector: 'my-app',
      template: `
        <div>
          <h2>Lets dynamically create some components!</h2>
          <button (click)="createComponent($event)">Create Hello World</button>
          <button (click)="createComponent($event)">Create World Hello</button>
          <dynamic-component [componentData]="componentData"></dynamic-component>
        </div>
      `,
    })
    

    而组件方法会有如下代码

    createComponent(val){
        if(val.srcElement.innerHTML==='Create Hello World')
        {
          this.createHelloWorldComponent()
        }
         if(val.srcElement.innerHTML==='Create World Hello'){
           this.createWorldHelloComponent()
         }
      }
    

    LIVE DEMO 更新了你的插件。

    更新 1:当您还没有准备好在 if 条件下处理它们时,您应该有一个映射属性来根据单击的项目返回 componentData。

    var myComponents =[{
            id : 1,
            component: HelloWorldComponent,
            inputs: { showNum: 9 }
        },{
            id : 2,
            component: WorldHelloComponent,
            inputs: { showNum: 0 }
        }];
    var myMenu =    [{
        id: 1, 
        viewname: 'HelloWorldComponent',
        componentID : 1
        },
        {
         id: 2, 
         viewname: 'WorldHelloComponent',
         componentID : 2
        }];
    

    LIVE DEMO

    【讨论】:

    • 您正在传递一个事件而不是读取内部 HTML,但我想而不是传递事件是从数组数据插入并将其传递给函数。按钮内部 HTML 将完全不同。所以我可以用你的例子。也像你最后那样使用 if 语句,我最终会得到 1000 个 if 语句。 :(
    • 通过寻找拼写检查和有意义的句子来更新上面的评论。
    • 评论更新了,但是你看到我的 plunker 有一个数组吗? plnkr.co/edit/HRKGhCCEfkOhNjXbr6C5?p=preview
    • 您应该使用 json 数组中的属性来指向特定的组件数据。将在一分钟内更新 plunker 并告诉
    • 万岁,你做到了!惊人的。因此,您在 click 函数中传递项目,而不是使用 _.find 将其链接到 myComponents...
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    相关资源
    最近更新 更多