【问题标题】:How to use extends for this angulr2 scenario?如何在这个 angulr2 场景中使用扩展?
【发布时间】:2023-03-15 06:32:02
【问题描述】:

在我的应用程序中核心组件是根组件,在这个页眉中,存在sidemenu设计,

SideMenu是动态的,所以我在其他sidemenu组件中编写代码的逻辑,

现在我想在核心组件中使用sidemenu的功能,我认为是 通过使用扩展来完成,

我的组件是

核心组件

import { Component, OnInit } from '@angular/core';
import {SidemenuComponent} from './sidemenu.component';

@Component({
  selector: 'my-admin',
  templateUrl: '../views/admin-header.html'
})

export class CoreComponent extends SidemenuComponent {

  constructor( private router: Router) {
    }

}

sidemenucomponent

import {OnInit } from '@angular/core';
import { Http, Response, Headers, RequestOptions } from '@angular/http';

import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/toPromise';
import {MenuService} from './core.service';

export class SidemenuComponent implements OnInit{
  userroleId : any;
  roleName: string;
  menuItems:any;
  constructor(private http: Http,private MenuService:MenuService) {
   this.userroleId =  localStorage.getItem("roleId")
  }

  ngOnInit(): void {
    this.getSideMenu();
  }

  getSideMenu () {
    if( this.userroleId == 1) {
      this.MenuService.getAdminMenu().subscribe(menuItems => this.menuItems= menuItems, error => console.log(error));
    }

    if(this.userroleId == 2){
      this.MenuService.getpractitionerMenu().subscribe(menuItems => this.menuItems= menuItems, error => console.log(error));
      console.log('ss')
    }
  }
}

菜单服务

import { Injectable }     from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/toPromise';

@Injectable()

export class MenuService {
  constructor(private http: Http) {}

  public getAdminMenu(): Observable<any> {
    return this.http.get("./app/core/adminsidemenu.json")
      .map((res:any) => res.json())
      .catch(this.handleError);
  }
  public getpractitionerMenu(): Observable<any> {
    return this.http.get("./app/core/practitioner.json")
      .map((res:any) => res.json())
      .catch(this.handleError);
  }

  private handleError(error: any): Promise<any> {
    console.error('An error occurred', error); // for demo purposes only
    return Promise.reject(error.message || error);
  }

}

这里我无法在核心组件中扩展侧边菜单组件。 我的控制台出现错误:

派生类的构造函数必须包含“超级”调用。

请帮帮我

【问题讨论】:

  • “我无法扩展核心组件中的侧边菜单组件”你说“无法”是什么意思?
  • 我的控制台出现错误**派生类的构造函数必须包含“超级”调用。**
  • 我无法复制这个,你有 plnkr 吗? Purhaps 尝试将 super(http, MenuService) 放入 CoreComponent 的构造函数中,而 CoreComponent 构造函数的参数包含 SidemenuComponent 的参数。

标签: oop angular typescript angular2-services angular2-directives


【解决方案1】:

看来您可能缺少 SidemenuComponent 上的 @Component 装饰器。

这是一个带有simple extended Component 的 Plunker,还有一篇关于它的好文章:Component Ineritance

【讨论】:

  • 我不想在我的 SidemenuComponent 中使用 @Component ,仅出于逻辑我将组件分开,这样我就可以在任何其他组件中使用它
  • 那么它不是一个组件,是吗?这是一项服务!为什么不直接将其设为 @Injectable() 并将其注入核心组件?
  • 你能告诉我如何将 SidemenuComponent 作为服务,我收到错误 ** @NgModule.entryComponents?**
  • @Injectable() 放在它上面并注入CoreComponent 的构造函数,就像你对MenuService 所做的那样?并在 ngModule 中的提供者中声明。
  • 如果我将 sidemenu 组件作为服务获取 entrycomponents 错误
【解决方案2】:

你需要在你的子类中调用父类的构造函数:

@Component({
  selector: 'my-admin',
  templateUrl: '../views/admin-header.html'
})

export class CoreComponent extends SidemenuComponent {

  constructor( private router: Router, http: Http, menuService:MenuService) {
     super(http,menuService);
  }

}

【讨论】:

  • 我收到类似 ----Class 'CoreComponent' 错误地扩展基类 'SidemenuComponent' 的错误。类型具有私有属性“http”的单独声明
  • 您没有提供足够的信息,因为您提供的代码中没有http 声明(对于CoreComponent)。我猜你不明白什么是私有/受保护/公共修饰符,是吗?而且我不确定你是否真的想扩展SideMenu
  • 我想要的究竟是什么意思,我的核心组件有这么多行代码,我想在其他组件中分离一些代码,这样我可以轻松阅读我的核心组件代码,
  • 好的,我是 angular2 新手,你能告诉我该怎么做
  • 你有面向对象的编程背景吗?你熟悉继承、实现(用于接口)、最终私有/公共/受保护的修饰符等概念吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
相关资源
最近更新 更多