Как динамически менять вид с одного компонента на другой в angular4 - PullRequest
0 голосов
/ 02 мая 2018

В моем приложении мне нужно изменить представления от одного компонента к другому на основе значений родительского компонента.

Просмотр структуры

<app-component>
<app-common></app-common>
</app-component>

Здесь я называю общий компонент дочерним компонентом приложения.

<app-common>
<app-grid></app-grid>
</app-common>

Здесь у меня есть компонент сетки как дочерний элемент общего компонента

common.html

   <div class="accordion col-sm-12" id="accordion1" *ngFor='let data of dropdownData; let i=index'>
            <div class="accordion-group">

                <div class="accordion-heading">
                    <a class="accordion-toggle h6" (click)="getCategory(categorycode.value)" data-toggle="collapse" data-parent="#accordion1" href="#collapseTwo + i">
                        {{data?.CAMD_ENTITY_DESC}}
                        <input type="hidden" #categorycode value="{{data?.PROD_PRCATG_CODE}}">
                    </a>
                </div>

                <div *ngFor='let group of data.group; let j=index' id="collapseTwo + i" class="accordion-body collapse" style="margin-left:10px">
                    <div class="accordion-inner">
                        <div class="accordion" id="accordion2">
                            <div class="accordion-group">

                                <div class="accordion-heading">
                                    <a class="accordion-toggle" (click)="getGroup(groupcode.value)" data-toggle="collapse" data-parent="#accordion2" [href]="'#collapseInnerTwo' + j">
                                        {{group?.CAMD_PRGRP_DESC}}
                                        <input type="hidden" #groupcode value="{{group?.PROD_PRGRP_CODE}}">
                                    </a>
                                </div>

                                <div [id]="'collapseInnerTwo' + j" class="accordion-body collapse" style="margin-left:10px;margin-top:3px">

                                    <div class="accordion-inner" style="cursor: pointer;" (click)="getSubgruop(subgroupcode.value)" *ngFor='let subgroup of group?.subgroup; let i=index'>
                                        {{subgroup?.CAMD_PRSGRP_DESC}}
                                        <input type="hidden" #subgroupcode value="{{subgroup?.PROD_PRSGRP_CODE}}">
                                    </div>
                                </div>

                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
         <app-grid></app-grid>

это аккордеон от этого пользователя, который может выбирать такие параметры, как категория, группа, подгруппа, поэтому каждый пользователь выбирает значения, необходимые в компоненте сетки для отображения представлений (вызов API будет получать данные из базы данных в компоненте сетки для каждого выбранного значения) ) динамически при выборе пользователем параметров.

common.component.ts

export class CommonComponent {

  categorycode :string ='';
  groupcode :string= '';
  subgroupcode:string='';

  constructor(private router: Router, private CartdataService: CartdataService) { }

  ngOnInit() {}

  public getCategory(categorycode){
    this.CartdataService.get_Category_Code(categorycode);
  }
  public getGroup(groupcode){
    this.CartdataService.get_Group_Code(groupcode); 
  }
  public getSubgruop(subgroupcode){
    this.CartdataService.get_Group_Code(subgroupcode); 
  }

}

grid.component.ts

  export class GridComponent {

  @Input() C_code: string;
  @Input() G_code: string;
  @Input() SG_code: string;

  products: any;



  constructor(private CartdataService: CartdataService, private router: Router) {
    this.router.events.subscribe(
      () => window.scrollTo(0, 0));
  }

  ngOnInit() {

    this.CartdataService.get_Selected_Category_Of_Products(this.C_code,
      this.G_code, this.SG_code).subscribe(
        data => {
          this.products = data;
        });
      }

  ngOnChanges(change: SimpleChange) {
    this.CartdataService.get_Selected_Category_Of_Products(this.C_code,
      this.G_code, this.SG_code).subscribe(
        data => {
          this.products = data;
        });
  }

}

grid.html

<div class="row">

    <div class="col-sm-4 column" *ngFor="let product of products;let i =index;">
        <div class="card">
            <div class="card-img-top card-img-top-250 one">
                <img routerLink="/my-cart" class="img-fluid" [src]="product['IMAGE_PATH_1']" alt="image">
                <img routerLink="/my-cart" class="img-fluid two" [src]="product['IMAGE_PATH_2']" alt="image">
            </div>
            <div class="card-block pt-2">
                <div class="col-sm-12 text-center card-text">
                    <span #Pname1>{{product?.ITEM_DESCRIPTION}}</span>
                    <br>
                    <input type="hidden" value="{{product?.PRODUCT_CODE}}">
                    <p class="font-weight-bold text-primary">{{product?.PRODUCT_PRICE}} &#8377;</p>
                </div>
                <button type="button" class="btn  btn-primary col-sm-12 corner" routerLink="/my-cart" (click)="getProductName(Pname1)">
                    <strong>View Details</strong>
                </button>
            </div>
        </div>
    </div>

</div>

Здесь выбранные пользователем раскрывающиеся значения передаются в служебный файл.

Как я упоминал выше, компонент сетки является дочерним по отношению к общему, поэтому при загрузке страницы компонент сетки отображает представления в соответствии со значениями в служебном файле, которые отправляются общим компонентом.

сейчас Когда пользователь выбрал некоторые значения из выпадающего списка в общем компоненте, эти значения передаются в файл сервиса. На основании этих значений я вызываю API из файла сервиса.

Теперь то, что я хочу сделать, - это когда новые значения поступают в служебный файл из общего компонента, и я хочу изменить представления компонента сетки на основе новых значений.

Если это возможно, пожалуйста, помогите мне решить. Спасибо

1 Ответ

0 голосов
/ 02 мая 2018

В GridComponent создайте поле @input и затем передайте значение из родительского компонента. Примерно так:

 @Input() inputValue: string;

Затем вы называете компонент вот так

<app-grid [inputValue]="valueFromCommon" ></app-grid>

Здесь значение от общего - это приходящее значение. Я использовал двухстороннее связывание здесь, но если вы не хотите, чтобы оно было изменено обратно, вы можете использовать одностороннее связывание.

Затем для обработки изменений у вас есть два варианта.

  • Предпочтительный метод:)

В компоненте grid вы можете создать такой метод (в основном реализовать при изменении)

 ngOnChanges(changes: SimpleChanges) {
        console.log("new value:",changes);
    }

Здесь объекты изменений содержат значение, которое изменилось, его предыдущее значение и его новое значение. Вы можете обработать его как угодно.

  • Другой метод, который я бы не рекомендовал, потому что это что-то вроде хака

Создание методов получения и установки для поля @input и обработка изменений в них

private _inputValue: string;

@Input() set inputValue(value: string) {    
   this._inputValue= value;
  // process new value here    
}

get inputValue(): string {    
    return this._inputValue;    
}

----- Редактируйте с актуальным кодом вашей проблемы -----

В вашем примере способ загрузки данных в компонент сетки из службы делает его отсоединенным от родительского компонента. Вы загружаете все в ngOnInit () из внедренного сервиса. Вместо этого вы должны передать значения, которые вы хотите от родительского компонента.

Например, измените их на входы

export class GridComponent {

 @Input()  C_code: string;
 @Input()  G_code: string;
 @Input()  SG_code: string;

Тогда в ngOnInit не извлекайте их из сервиса и используйте те, которые пришли из родительского компонента

ngOnInit() {
  this.CartdataService.get_Selected_Category_Of_Products(this.C_code, 
          this.G_code, this.SG_code).subscribe(
        data => {
            this.products = data;
            console.log(data);
   });
}

Затем для вызова компонента сетки используйте:

  <app-grid [C_code]="categorycode" [G_code]="groupcode" [SG_code]="subgroupcode" ></app-grid>

Таким образом, вы передадите значения, выбранные из общего компонента, в компонент сетки. Теперь для обработки изменений этих значений (изменения распространяются на компонент автоматически, но если у вас есть внешняя логика изменения, вам нужно добавить ее). Поэтому в компоненте сетки добавьте этот метод:

ngOnChanges(changes: SimpleChanges) {
             this.CartdataService.get_Selected_Category_Of_Products(this.C_code, 
              this.G_code, this.SG_code).subscribe(
            data => {
                this.products = data;
                console.log(data);
       });
     }

Что в основном делает то же самое, что и ngOnInit - запрашивает сервис. Это то, что вы хотите делать при изменении свойства - запросить услугу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...