Angular и Typescript с bootstrapModals Разным текстом кнопки модального вызова в разных компонентах

#angular #typescript #bootstrap-modal #angular-bootstrap #angular-module

#angular #typescript #bootstrap-модальный #angular-bootstrap #angular-модуль

Вопрос:

У меня есть компонент с именем Modal, когда я работаю в Angular. Я хочу открыть один и тот же модальный компонент из двух разных мест. Но я хочу, чтобы текст кнопки, упомянутой в баннере на данном изображении, должен быть «Начать сейчас», см. Изображение.

введите описание изображения здесь

Вот код modal.component.html с кнопкой.

 <div class="modal-here">    
    <ng-template #content let-modal>
      <div class="modal-header">
        <h4 class="modal-title">Modal 1</h4>
        <button type="button" class="close" aria-label="Close" (click)="modal.dismiss('Cross click')">
          <span aria-hidden="true">amp;times;</span>
        </button>
      </div>
      <div class="modal-body">
        <p>Modal 1 bodyamp;hellip;</p>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-light" (click)="modal.close('Close click')">Close</button>
      </div>
    </ng-template>
    <button class="btn post-task" (click)="openVerticallyCentered(content)">Post a task</button>
</div>

 

Вот код кода modal.component.ts

 import { Component, OnInit } from '@angular/core';
import {NgbModal, ModalDismissReasons} from '@ng-bootstrap/ng-bootstrap';

@Component({
    selector: 'app-modal',
    templateUrl: './modal.component.html',
    styleUrls: ['./modal.component.css']
})
export class ModalComponent implements OnInit {

    closeResult: string;

    constructor(private modalService: NgbModal) {}

    ngOnInit(): void {
    }

    openVerticallyCentered(content) {
        this.modalService.open(content, { centered: true, windowClass: 'setClass' });
    }

}

 

Вот header.component.html html и typescript код, в котором я хочу тот же модальный код с тем же текстом в кнопке, что и уже размещенный

 <header>
    <nav class="container navbar navbar-expand-md fixed-top nav-setting">
        <ng-container *ngFor= "let main_link of logo_link">
            <a class="navbar-brand brand-logo" href="{{main_link.href}}">
                <img class="img-fluid" src="../assets/images/logo.png">
            </a>
        </ng-container>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse"
            aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarCollapse">
            <ul class="navbar-nav mr-auto left-menu">
                <app-modal></app-modal>
                <ng-container *ngFor= "let l_menu of left_menus">
                    <li class="nav-item">
                        <a class="{{l_menu.class}}" href="{{l_menu.routerLink}}">{{l_menu.text}}</a>
                    </li>
                </ng-container>
            </ul>
        </div>
        <div class="admin-side">
            <ul class="navbar-nav ml-auto right-menu">
                <ng-container *ngFor= "let r_menu of right_menus">
                    <li class="nav-item">
                        <a class="{{r_menu.class}}" routerLink="{{r_menu.routerLink}}">{{r_menu.text}}</a>
                    </li>
                </ng-container>
            </ul>
        </div>
    </nav>
</header>

 

Here is header.component.ts code

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

@Component({
    selector: 'app-header',
    templateUrl: './header.component.html',
    styleUrls: ['./header.component.css']
})
export class HeaderComponent implements OnInit {

    logo_link = [
        {"href" : "http://localhost:4200/"}
    ]

    left_menus = [
    
        {"routerLink" : "", "text" :"Categories", "class" : "uper-line nav-link"},

        {"routerLink" : "/tasks", "text" :"Browse tasks", "class" : "uper-line nav-link"},
        
        {"routerLink" : "/how-it-works", "text" :"How it works", "class" : "uper-line nav-link"}
    ]
    right_menus = [
        {"routerLink" : "/sign-up", "text" :"Sign Up", "class" : "nav-link sign-up"},
        
        {"routerLink" : "/login", "text" :"Login", "class" : "nav-link login"},

        {"routerLink" : "/earn-money", "text" :"Become a Tasker", "class" : "nav-link tasker"}
    ]

    constructor() { }

    ngOnInit(): void {
    
    }

}

 

Here is app.component.html banner html and typescript code where I want to use same modal but text of button should be changed with «Get Started Now».

 <app-header></app-header>
<div class="content" role="main">
    <div class="container-fluid banner position-relative">
        <div class="row bg-image">
          <div class="col-sm-12"></div>
        </div>  
        <div class="row align-items-center banner-content position-absolute m-0 w-100">
            <div class="col-sm-12">
                <div class="custome-container">
                    <h1 class="title banner-title">
                      Connect with experts to get the job done on Airtasker
                    </h1>
                    <p class="description banner-text">
                        It’s amazing what you can’t do yourself
                    </p>
                    <div class="banner-button">
                        <app-modal></app-modal>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container-fluid">
        <div class="row">
            <div class="col-sm-12">
                <div class="custome-container need-section">
                    <div class="inner-grid">
                        <h2 class="title">What do you need done?</h2>
                        <div class="services">
                            <div class="">
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<app-footer></app-footer>
<router-outlet></router-outlet>

 

Here is app.component.ts code.

 import { Component } from '@angular/core';
import {NgbConfig} from '@ng-bootstrap/ng-bootstrap';
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'Problemsolver';
  constructor(ngbConfig: NgbConfig) {
    ngbConfig.animation = true;
  }
}

 

Вот код app.module.ts

 import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import {NgbPaginationModule, NgbAlertModule} from '@ng-bootstrap/ng-bootstrap';
import { HeaderComponent } from './header/header.component';
import { ModalComponent } from './modal/modal.component';
import { FooterComponent } from './footer/footer.component';

@NgModule({
  declarations: [
    AppComponent,
    HeaderComponent,
    ModalComponent,
    FooterComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    NgbModule,
    NgbPaginationModule,
    NgbAlertModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

 

CSS для всего этого кода здесь.

 @font-face {
  font-family: Museo Sans Regular;
  src: url(assets/Fonts/MuseoSans-300.otf);
}
@font-face {
  font-family: Museo Sans Bold;
  src: url(assets/Fonts/MuseoSans_700.otf);
}
@font-face {
  font-family: Museo Sans Black;
  src: url(assets/Fonts/Museo-black.otf);
}
@font-face {
  font-family: MuseoSansBold;
  src: url(assets/Fonts/MuseoModerno-Bold.ttf);
}
body {
    font-family: Museo Sans Regular !important;
}
h1, h2{
    font-family: Museo Sans Black !important;
}
h3, h4, h5, h6{
    font-family: Museo Sans Bold !important;
}
.bg-image {
    background: url(../assets/images/top-banner.jpg);
    max-height: 616px;
    height: 100%;
    background-size: cover;
    background-position: top center;
}
.banner {
    height: calc(100vh - 120px);
    max-height: 616px;
    min-height: unset;
    background: rgb(41, 43, 50);
}
.custome-container {
    max-width: 944px;
    margin: auto;
    padding: 0px 32px;
}
.banner-content {
    top: 50%;
    left: 0px;
    transform: translateY(-40%);
}
.banner-title {
    font-size: 45px;
    color: #fff;
    margin: 0px 0px 16px;
}
.banner-text {
    color: rgb(255, 255, 255);
    font-size: 34px;
    font-weight: initial;
    line-height: 40px !important;
    letter-spacing: -0.15px;
    text-decoration: initial;
    text-align: initial;
    vertical-align: initial;
    font-style: initial;
    white-space: initial;
    margin: 0px;
    padding: 0px;
}
.banner-button {
    margin: 24px 0px;
}
.banner-button button {
    border-radius: 160px;
    display: inline-block;
    text-align: center;
    white-space: nowrap;
    cursor: pointer;
    box-sizing: border-box;
    margin: 0px;
    border-color: rgba(0, 0, 0, 0);
    border-width: 2px;
    border-style: solid;
    color: rgb(255, 255, 255);
    padding: 16px 24px;
    font-size: 18px;
    font-weight: initial;
    line-height: 24px !important;
    letter-spacing: 0.15px;
    background-color: rgb(224, 68, 109);
}
.modal-here {
    display: flex;
    height: 100%;
    align-items: center;
}
.post-task {
    background: #e0446d;
    border-radius: 200px;
    border: 2px solid rgba(41,43,50,.1);
    text-shadow: 0 1px 2px rgba(0,0,0,.25);
    transition: text-shadow .35s cubic-bezier(.615,.19,.305,.91),border .35s cubic-bezier(.615,.19,.305,.91);
    font-size: 11px;
    height: 31px;
    display: flex;
    letter-spacing: .44px;
    line-height: 27px;
    margin: 0 10px 0 20px;
    overflow: hidden;
    text-align: center;
    text-shadow: 0 1px 1px #9a0137;
    width: 94px;
    color: #fff;
    align-items: center;
}
.nav-setting {
    padding-left: 60px;
    padding-right: 60px;
}
.brand-logo img {
    width: 120px;
}
.navbar-brand.brand-logo {
    margin-right: 20px;
}
.nav-link {
    color: white;
    cursor: pointer;
    display: flex;
    align-items: center;
    height: 41px;
    font-size: 13px;
    letter-spacing: .4px;
    position: relative;
    text-decoration: none;
    white-space: pre-wrap;
    padding: 0px 10px;
}
.nav-link:hover {
    opacity: 0.6;
}
.nav-item {
    display: flex;
    align-items: center;
}
.nav-link.tasker {
    margin-right: 4px;
    font-size: 11px;
    padding: 5.5px 14.1px;
    border-radius: 200px;
    display: inline-block;
    letter-spacing: .05em;
    transition: text-shadow .35s cubic-bezier(.615,.19,.305,.91),border .35s cubic-bezier(.615,.19,.305,.91);
    box-sizing: border-box;
    background-color: transparent;
    border: 1px solid #fff;
    box-shadow: none;
    height: auto;
    opacity: 1;
}
.nav-link.tasker:hover {
    background-color: #fff;
    border: 1px solid #008fb4;
    color: #008fb4;
    opacity: 1;
}
.uper-line.nav-link:before {
    content: "";
    display: block;
    position: absolute;
    background-color: #fff;
    border-radius: 1.5px;
    height: 3px;
    left: 0;
    margin: auto;
    right: 0;
    width: 80%;
    z-index: 1000;
    transform: translateY(-100%);
    transition: transform .2s cubic-bezier(.615,.19,.305,.91);
    opacity: 0;
    top: -8px;
}
.uper-line.nav-link:hover:before{
    opacity: 0.6;
    transform: translateY(0);
}

 

Вот изображение, которое описывает фактический результат, который я хочу.

введите описание изображения здесь

Ответ №1:

Вы должны добавить переменную в modal.component.ts, а затем использовать значение этой переменной в modal.component.html файл

 _btnLabel: string = '';
 

затем для получения ввода используйте @Input

 @Input()
set btnLabel(value) {
    this._btnLabel = value;
}
 

Теперь вы можете использовать это значение в себе modal.component.html файл

 <button>{{_btnLabel}}</button>
 

Теперь установите переменную в ts-файле компонента, в котором вам нужно значение.
как и в этом случае, перейдите в файл header.component.ts и в наборе exports определите переменную с нужным вам значением, как:

 
_header: string = "Post a task";


 

Получите это определенное значение в html-файле, как в этом случае header.component.html файл

 
<app-modal [btnLabel] = "_header"></app-modal>

 

Комментарии:

1. Это правильный ответ. Точно соответствует ситуации. Спасибо, дорогой @NadeemArif.

2. Приветствую вас @MuhammadNadeemArif. Ваша признательность дает нам энергию. Спасибо.

Ответ №2:

 closeResult: string;

@Input() buttonLabel: string;

}
 

Теперь, когда вы вызываете компонент из любого другого html, вы можете указать текст для модальной кнопки, заменить на <app-modal [buttonLabel]=»Начать сейчас»> или <app-modal [buttonLabel]=»Опубликовать задачу»>

 <button class="btn post-task" (click)="openVerticallyCentered(content)">{{buttonLabel}}</button>

 

Комментарии:

1. спасибо за ваш ответ, но, сэр, возникает ошибка «не удается найти имя ‘buttonLabel’ в @Input(): buttonLabel: string;»

2. сэр, все еще есть ошибка « src /app/header/header.component.html:14:45 — ошибка NG5002: ошибка синтаксического анализатора: неожиданный токен «a» в столбце 6 в [Опубликовать задачу] в C:/Users/Muhammad Надим Arif/Desktop/ANGULAR/Problemsolver/src/app/header/header.component.html@13:44 14 <app-modal [buttonLabel] = «Опубликоватьзадача «></app-modal> «