zoukankan      html  css  js  c++  java
  • [Angular] Difference between Providers and ViewProviders

    For example we have a component:

    class TodoList {
      private todos: Todo[] = [];
    
      add(todo: Todo) {}
    
      remove(todo: Todo) {}
    
      set(todo: Todo, index: number) {}
    
      get(index: number) {}
    
      getAll() {}
    }
    
    @Component({
      // ...
      viewProviders: [TodoList]
      // ...
    })
    class TodoAppComponent {
      constructor(private todos: TodoList) {}
      // ...
    }

    For TodoAppComponent, we make 'TodoList' as 'viewProviders'. 

    And inside TodoAppComponent, we have TodoInputComponent & TodoComponent as view children, and AppFooterComponent as content child:

    @Component({
      selector: 'todo-app',
      template: `
        <section>
          Add todo:
          <todo-input (todo)="addTodo($event)"></todo-input>
        </section>
        <section>
          <h4 *ngIf="todos.getAll().length">Todo list</h4>
          <todo *ngFor="let todo of todos.getAll()" [todo]="todo">
          </todo>
        </section>
        <ng-content select="app-footer"></ng-content>
      `
    })

    So now, if we want to inject TodoList into TodoInputComponent and TodoComponent, that's fine. But once we try to inject TodoList service into FooterComponent, it will show the error:

    ORIGINAL EXCEPTION: No provider for TodoList!

    This is because when we use 'viewProviders' we can only inject service into component and its view children. Content Children (passed in by ng-content) cannot be injected.

    When to use viewProviders?

    Why would I use viewProviders, if such providers are not accessible by the content children of the component? Suppose you’re developing a third-part library, which internally uses some services. These services are part of the private API of the library and you don’t want to expose them to the users. If such private dependencies are registered with providers and the user passes content children to any of the components exported by the public API of your library, she will get access to them. However, if you use viewProviders, the providers will not be accessible from the outside.

  • 相关阅读:
    image/pjpeg和image/jpeg问题
    windows server 2003 服务器中 HTTP 错误401.1 未经授权:访问由于凭据无效被拒绝
    解决了界面上菜单项跑到其它AE控件后面的问题(java)
    清除地图中的所有图层和FileFilter的使用
    设置pagelayoutControl控件显示滚动条
    pagelayoutControl中添加图元(VB)
    添加和删除字段(vb)
    用代码实现toolbar弹出ButtonMenus(VB)
    pageLayoutControl与Mapcontrol同步(VB)
    C++ Builder XE2随意学习 (1)
  • 原文地址:https://www.cnblogs.com/Answer1215/p/6417951.html
Copyright © 2011-2022 走看看