在Angular 2发布版本中重新渲染特定组件

问题描述:

我有两个组件:BuilderComponent和InputTextComponent。 通过拖放操作,我在BuilderComponent模板的sortableList元素中放置了一个指令。与检查人员,我可以看到该指令出现在sortablelist DOM元素:在Angular 2发布版本中重新渲染特定组件

<div class="row"> 
<div class="col-md-12"> 
    <ul id="sortableList"> 
     <zbjfb-input-text></zbjfb-input-text> 
    </ul> 
</div> 

我怎么能强迫BuilderComponent检测到自上次编译模板的内容发生变化,然后重新使用新添加的指令呈现模板,以便我可以看到新编译的InputTextComponent。

BuilderComponent:

import { Component } from '@angular/core'; 

@Component({ 
    selector: 'zbjfb-builder', 
    template: ' 
    <div class="row"> 
    <div class="col-md-12"> 
     <ul id="sortableList"> 

     </ul> 
    </div> 
    </div> 
    ' 

}) 
export class BuilderComponent {} 

InputTextComponent:

import { Component } from '@angular/core'; 

@Component({ 
    selector: 'zbjfb-input-text', 
    templateUrl: './input-text.component.html', 
    styleUrls: ['./input-text.component.css'] 
}) 
export class InputTextComponent {} 

任何想法?

在此先感谢。

如果拖放解决方案是基于HTML5,也许你可以从“@角/核心”使用HostListener装饰的破解您的拖放交换逻辑:

添加这样的事情上你拖放区域组成:

@HostListener('drop', ['$event']) 
onDrop(event: any) { 
    //do something    
} 

而且这样的事情你可拖动组件上:

@HostListener('dragstart', ['$event']) 
onDrag(event: any) { 
    //do something 
} 

HostListeners为您提供的方式来实现常规听众˚F或onmousedown,onkeyup,ondrop,ondrag等元素事件。

然后想出一些逻辑来确定什么是拖/放和改变拖曳区域组件模型。下面是一些功能代码我已上拖放灵感来自W3Schools的话题:

import { Component, HostListener, Input } from '@angular/core'; 

// The draggable component 
@Component({ 
    selector: 'dragme', 
    template: ` 
     <div draggable="true"> 
      Drag {{name}}! 
     </div> 
    `, 
    styles: [` 
     [draggable] { 
      -moz-user-select: none; 
      -khtml-user-select: none; 
      -webkit-user-select: none; 
      user-select: none; 
      -khtml-user-drag: element; 
      -webkit-user-drag: element; 
      background-color: #AAA; 
      border: 1px solid black; 
      padding: 24px; 
      margin: 12px; 
     } 
    `] 
}) 
export class DragMe { 

    @Input() 
    name:string = ""; 

    @HostListener('dragstart', ['$event']) 
    onDrag(event:any){   
     event.dataTransfer.setData("name",this.name); 
    } 
} 

// The drop area component 
@Component({ 
    selector: 'drop', 
    template: ` 
     <div class="drop"> 
      Drop over me! 
      <ul> 
       <li *ngFor="let i of items">{{i}}</li> 
      </ul> 
     </div> 
    `, 
    styles: [` 
     .drop{ 
      border: 1px solid black; 
      padding: 24px; 
     } 
    `] 
}) 
export class DropOverMe { 

    items:string[] = []; 

    @HostListener('dragover', ['$event']) 
    onDragover(event:any){ 
     event.preventDefault(); 
    } 

    @HostListener('drop', ['$event']) 
    onDrop(event:any){ 
     event.preventDefault();   
     var name = event.dataTransfer.getData("name");       
     this.items.push(name); 
    } 
} 

// The functional example 
@Component({ 
    selector: "drag-example", 
    template: ` 
     <dragme name="Bob"></dragme> 
     <dragme name="Alice"></dragme> 
     <dragme name="Carl"></dragme> 

     <drop></drop> 
    ` 

}) 
export class DragExample{ 

} 

的完整代码在:https://github.com/rafaelodon/angular2-html5-dragndrop-example