【问题标题】:Passing service from child component to parent component将服务从子组件传递到父组件
【发布时间】:2019-01-21 12:22:17
【问题描述】:

所以我有一个基本组件 (ListComponent) 和一个父组件 (Businesses2ListComponent)。这个想法是我们有多个表/类型的列表,它们都派生自 ListComponent。因此我们必须通过正确的服务。

在本例中,我想将 BusinessService(扩展 BaseService)传递给 BaseComponent。

这是 ListComponent:

@Component({
  selector: 'app-list',
  templateUrl: './list.component.html',
  styleUrls: ['./list.component.scss']
})
export class ListComponent<S extends BaseService<T, L>, T, L> implements OnInit {

  constructor(private viewContainerRef: ViewContainerRef,
              private domElement: ElementRef,
              private ngForage: NgForage,
              private route: ActivatedRoute,
              private router: Router,
              private injector: Injector,
              private dataService: S) {
  }
  
}

这是我的 Business2ListComponent:

@Component({
  selector: 'app-businesses2-list',
  templateUrl: './businesses2-list.component.html',
  styleUrls: ['./businesses2-list.component.scss']
})
export class Businesses2ListComponent extends ListComponent<BusinessService, Business, BusinessList> implements OnInit {

  constructor(viewContainerRef: ViewContainerRef,
              domElement: ElementRef,
              ngForage: NgForage,
              dataService: BusinessService,
              route: ActivatedRoute,
              router: Router,
              injector: Injector) {
    super(viewContainerRef, domElement, ngForage, route, router, injector, dataService);
  }

  ngOnInit() {
  }

}

现在这是我在尝试运行时遇到的错误:

我认为这是搞砸的最后一个论点,但我还能做什么?

【问题讨论】:

    标签: angular typescript frontend web-frontend


    【解决方案1】:

    当 Angular 显示问号时,它找不到您尝试注入的对象,这可能是多种原因,但一个好的起点是您的模块文件。您是否已将实例化的 BusinessService 添加到模块提供程序中?

    【讨论】:

    • 我将 BusinessService 添加到 AppModule 中(之前在 BusinessesModule 中),但它没有改变任何东西。我还在原始帖子中添加了控制台中的错误。
    【解决方案2】:

    你不能在你的构造函数上这样做:private dataService: S

    2个选项:你可以改变你的构造函数来接受这样的:

    private dataService: new () =&gt; S

    当您调用 super() 时,您的 BusinessListComponent 构造函数可能会出现 TSLint 错误,但它可以正常工作。

    在您的情况下,我更喜欢使用 OOP,因为我认为没有任何理由在您的 ListComponent&lt;BusinessService, Business, BusinessList&gt; 上传递 BusinessService。这是一个 stackblitz 展示了这个方法。

    你的BusinessListComponent在哪里

    export class BusinessListComponent extends ListComponent<Business, BusinessList> implements OnInit {
    
      constructor(//...your args, private businessService: BusinessService) { 
        super(// ... your args, businessService);
      }
    
      ngOnInit() {
      }
    }
    

    你的ListComponent变成这样:

    export class ListComponent<T, L> implements OnInit {
      constructor(private dataService: BaseService<T, L>) { 
      }
      ngOnInit() {
      }
    }
    

    你的BusinessService在哪里

    export class BusinessService extends BaseService<Business, BusinessList> {
      constructor() {
        super();
      }
    }
    

    希望对您有所帮助。

    【讨论】:

    • 最后一种方法是不可能的,因为 BusinessService 为 BaseService 设置了一个端点和一个序列化程序。我试过了,发送到服务器的请求中有错误(端点未定义)。第一个也不行。我在控制台中遇到与以前相同的错误。
    • 也许您可以根据您的代码为这个问题制作一个简单的堆栈闪电战?虽然不确定ListComponent&lt;S extends BaseService&lt;T, L&gt;, T, L&gt; 的原始代码有何不同,因为它是对S 的类型检查以扩展BaseService,因此您最终会遇到与我的第二种方法相同的错误。
    • 这里是:stackblitz.com/edit/angular-t542ym - 为了简单起见,我删除了 ListComponent 中所有与 T & L 相关的内容。
    • @YassineZeriouh,stackblitz 中有很多错误无法编译,所以这里有一个你的准系统分支来获得endpoint,但我在第二种方法中实现。 stackblitz.com/edit/angular-h9pxm3 ,如果您查看控制台,您可以看到端点,也许我在您调用服务的方式上做了一些不同的事情?我不确定。
    猜你喜欢
    • 1970-01-01
    • 2018-06-30
    • 2019-01-04
    • 2020-10-17
    • 2019-02-27
    • 2017-04-20
    • 1970-01-01
    相关资源
    最近更新 更多