代码之家  ›  专栏  ›  技术社区  ›  Snake Eyes

将图像从api url加载到angular 5组件中

  •  3
  • Snake Eyes  · 技术社区  · 8 年前

    我有一个html结构类似的组件:

    <img mat-card-sm-image src="{{img}}" />
    

    和在typescript中

    constructor(private loginService: LoginService) {
        this.img = null;
        this.loadImage();
      }
    
    loadImage = function () {
       this.img = this.loginService.loginImg();
    }
    

    和登录服务:

    loginImg() {
        const url = "http://localhost:59078/api/image/login";
        this.http.get(url, { responseType: 'blob' }).subscribe(result => {
          console.log(result);
          return result;
        });
    }
    

    和API核心控制器

      [HttpGet]
      [AllowAnonymous]
      [Produces("image/png")]
      public IActionResult Login()
      {
         var file = Path.Combine(Directory.GetCurrentDirectory(),
                            "wwwroot", "images", "login.png");
    
         return PhysicalFile(file, "image/png");
      }
    

    图像未加载的想法。。。为什么?

    1 回复  |  直到 8 年前
        1
  •  5
  •   MilesStanfield    6 年前
    this.http.get(url, { responseType: 'blob' }).subscribe(result => {
      console.log(result);
      return result;
    });
    

    这个 return 这里什么都不做(尤其是因为您没有返回http.get本身)。服务应该返回可观察的http。获取(没有订阅),然后当您从组件订阅它时,您可以更改 img 内部变量。

    下面是您可以修复它的方法

    public img: string;
    
    constructor(private loginService: LoginService) {
      this.loadImage();
    }
    
    loadImage() {
      this.loginService.loginImg().subscribe(result => {
        this.img = result;
      });
    }
    
    
    # Login service:
    
    loginImg() {
      const url = "http://localhost:59078/api/image/login";
      return this.http.get(url, { responseType: 'blob' });
    }
    

    这是不相关的,但您可以考虑使用角度生命周期挂钩,如 ngOnInit 而不是初始化变量的构造函数

    constructor(private loginService: LoginService) { }
    
    public ngOnInit(): void {
      this.loadImage();
    }