zoukankan      html  css  js  c++  java
  • [Angular 2] Value Providers & @Inject

    Dependecies aren’t always objects created by classes or factory functions. Sometimes, all we really want is inject a simple value, which can be a primitive, or maybe just a configuration object. For these cases, we can use value providers and in this lesson we’ll discuss, how they are created.

    For example we have this code:

    import {LoggerProvider} from './LoggerProvider';
    import (Http) from '@angular/http'; import {Injectable} from
    '@angular/core'; @Injectable export class TodoService{ apiUrl : string = "http://localhost:3000/api" constructor(private logger: LoggerProvider, private http: Http){ } getTodos(){ this.logger.debug('Items', this.todos); return this.http.get(`${this.apiUrl}/todos`).map(res => res.json()); } }

    Code use hard coded 'apiUrl' to get data from backend. It would be better to inject apiUrl instead of hard coded.

    app.ts:

     providers: [
        TodoService,
        ConsoleService,
        TranslateService,
       ,{
            provide: LoggerProvider, useFactory: (cs, ts) => {
                 return new LoggerProvider(cs, ts, true)
            },
            deps: [ConsoleService, TranslateService]
        } 
       ,{
            provide: apiUrl,
            useValue: 'http://localhost:3000/api'
        }
    ], 

    Inside providers we add another value provider. Using keyword 'useValue'.

    Then in the TodoService, we can do:

    import {LoggerProvider} from './LoggerProvider';
    import {Injectable} from '@angular/core';
    import {Http} from '@angular/core'; import {Inject} from
    '@angular/core'; @Injectable export class TodoService{ constructor(@Inject(apiUrl) private apiUrl, private logger: LoggerProvider, private http: Http){ } getTodos(){ this.logger.debug('Items', this.todos); return this.http.get(`${this.apiUrl}/todos`).map(res => res.json()); } }

    We add @Inject because 'apiUrl' doesn't have annotation for 'apiUrl'.  Angular provide @Inject for this case. @inject is a decorator that we can attach to the constructor parameter so we can annotate them with the required metadata.

    Another thing to note is that @inject takes any token, not just strings.

    We can also do:

    constructor(@Inject(apiUrl) private apiUrl, @Inject(LoggerProvider) private logger, private http: Http){ }

    This is useful if we happen to write our Angular 2 application in a language other than TypeScript, where type annotations don't exist.

  • 相关阅读:
    windows :Tomcat免安装版环境变量配置 + jdk配置
    如何在官网下载Spring jar包
    浅析win32 Win64 x86 x64 区别 及Eclipse启动报Java was started but returned exit code=13 错误
    MyBatis拦截器打印不带问号的完整sql语句方法
    MyBatis多个接口参数报错:Available parameters are [0, 1, param1, param2], 及解决方法
    Leetcode40--->Combination Sum II
    Leetcode39--->Combination Sum(在数组中找出和为target的组合)
    Leetcode38--->Count and Say
    js 保留小数位数
    如何禁用easyui-linkbutton 中的Click事件
  • 原文地址:https://www.cnblogs.com/Answer1215/p/5880241.html
Copyright © 2011-2022 走看看