繁体   English   中英

角向组件附加DOM

[英]Angular attach DOM to Component

因此,在angularjs中,您可以定义指令并将html模板绑定到已经存在的控制器。 原则上,这意味着您可以将控制器重用于多个指令,因此可以用于多个模板。

angular
.module('App')
.component('Name', {
    templateUrl: 'some.html',
    controller: 'someController'
});

如何在Angular中执行此操作。 据我了解,它在Angular Components中是指令,并且总是直接绑定html。 基本上,我想使用另一个视图,该视图仅更改html,但保持相同的功能。

编辑:

基本上我想要这样:

@Component({
    selector: 'jhi-exercise-list',
    templateUrl: '(MULTIPLE HTML TEMPLATE PATHS HERE)',
    providers: [                      
                ]
})
    export class className{

    //USING THE SAME COMPONENT CODE FOR THE MULTIPLE TEMPLATES

    constructor(){}
}

到目前为止,我发现的唯一选择是通过扩展,但是我认为那太过分了。

templateUrl定义为函数

您可以指定templateUrl为代表的URL字符串或为这需要两个参数的函数 tElementtAttrs

该函数采用以下参数:

  • tElement模板元素-声明了指令的元素。

  • tAttrs模板属性-在此元素上声明的属性的规范化列表。

有关更多信息,请参见AngularJS综合指令API参考-templateURL

经过更多研究,似乎我能想到的最佳解决方案是使用继承。

https://coryrylan.com/blog/angular-component-inheritance-and-template-swapping

他对此有很好的描述

谢谢所有帮助我的人;)

angularjs中必须有一些指令,如ng-if或类似的指令。

在Angular 4中,您可以通过以下方式之一

<div *ngIf="x === 1"></div>
<div *ngIf="x === 2"></div>

您可以根据需要传递x的值。

新增解决方案

import { Component, Input } from '@angular/core';
import { Blogger } from '../models/blogger';
import { BloggerProfileService } from '../service/blogger-profile.service';
import { SharedService } from '../service/shared.service';
import { AuthService } from '../auth-service.service';
import { Router } from '@angular/router';

@Component({
  selector: 'article-author-panel',
  templateUrl: './article-author-panel.component.html',
  styleUrls: ['./article-author-panel.component.css']
})
export class ArticleAuthorPanelComponent {

  @Input('templateType') templateType;
  author;
  blogger : Blogger;
  articleDt;
  user;

  @Input()
    get articleDate(){
      return this.articleDt;
    }

    set articleDate(date){
      this.articleDt = this.sharedService.getUTCDate(new Date(date));
    }
  @Input()

  set articleAuthor(author) {
    this.author = author;
    this.bloggerProfileService.getBlogger(author)
    .take(1)
    .subscribe((blogger) => {
      this.blogger = blogger;
    })
  }

  get articleAuthor() {
    return this.author;
  }

  constructor(
    private bloggerProfileService: BloggerProfileService,
    private sharedService: SharedService,
    private router : Router,
    private authService: AuthService
  ) {
    authService.user$
    .take(1)
    .subscribe((user) => {
      if(user) this.user = user;
    });
  }

  clickFollow(){
    if(this.user === null || this.user === undefined){
      this.router.navigate(['/']);
    }
  }

}

模板

<ng-container *ngIf="templateType === 1">
    <div class="row no-gutters" style="border-top: 1px solid #a0a0a0; padding-top:5px;">
        <div class="col-2">
            <img src="http://www.publicdomainpictures.net/pictures/170000/velka/spinach-leaves-1461774375kTU.jpg" alt="Person" class="aap-image">
        </div>
        <div class="col-10">
            <div class="row">
                <div class="col-9">
                    <div class="aap-b-detail" *ngIf="blogger">
                        <span class="aap-b-name">{{ blogger.name }}</span>
                        <br />
                        <span class="aap-b-summary">{{ blogger.summary }}</span>
                    </div>
                </div>
                <div class="col-3">
                    <button class="aap-follow" (click)="clickFollow()">Follow</button>
                </div>
            </div>
        </div>
    </div>
</ng-container>
<ng-container *ngIf="templateType === 2">
    <div class="row no-gutters">
        <div class="col-2">
            <img src="http://www.publicdomainpictures.net/pictures/170000/velka/spinach-leaves-1461774375kTU.jpg" alt="Person" class="aap-image">
        </div>
        <div class="col-10">
            <div class="row">
                <div class="col-9">
                    <div class="aap-b-detail aap-b-detail-lh" *ngIf="blogger">
                        <span class="aap-b-name">{{ blogger.name }}</span>
                        <br />
                        <span class="aap-b-summary">{{ blogger.summary }}</span>
                        <br />
                        <span class="aap-b-date">{{ articleDate }}</span>
                    </div>
                </div>
                <div class="col-3">
                    <button class="aap-follow" (click)="clickFollow()">Follow</button>
                </div>
            </div>
        </div>
    </div>
</ng-container>

这是我创建的组件,根据放置组件的位置布局会发生变化。 您可以将其视为正常连接在一起的两个不同的html,前提是其他后面的代码保持不变。 根据我的需求,我没有使用每个变量。 希望这可以帮助。

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { LoadingComponent } from './loading.component'

@NgModule({
imports: [
CommonModule
],
declarations: [LoadingComponent],
exports: [LoadingComponent]
})
export class LoadingModule { }

在这种情况下,我计划在多个地方重用加载组件。 我会在注射区域特异性上午该模块打算使用加载组件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM