如何用角度刷新图像

Posted

技术标签:

【中文标题】如何用角度刷新图像【英文标题】:How to refresh an image with angular 【发布时间】:2019-02-18 07:58:52 【问题描述】:

我需要刷新这样加载的图像:

<img [src]="linkPicture" alt="profile photo" width="150px" height="150px">

在打字稿文件中,我有一个变量 this.linkPicture 我最初存储链接。当我更新图片时不要刷新。我再次设置变量....

这是我的打字稿代码的一部分

public linkPicture          : string;

初始设置变量

this.service.GetProfile(id).subscribe(resp => 
        .....
        this.linkPicture = resp.Photo;
        console.log(resp); //this show the photo
    );

当我更新图片时

let dialogRef = this.dialog.open(DialogUploadPhotoComponent, 
        data: 
            patientID: this.ss.getCurrentUserApi().PatientID
        ,
        width : "550px",
        );
        dialogRef.afterClosed().subscribe(result => 
            if(result != undefined)
                console.log(result);
                this.linkPicture = result;   //I set the new picture.                   
            
        );

【问题讨论】:

你是如何更新图片的?你的意思是你要更新链接/链接的内容? 是的,当然,我将新链接放入服务的响应中并设置变量。 如果您能向我们展示一些代码会更好......这将有助于回答者准确指出您遗漏的地方 我猜你正在更新服务器端的图像并且 URL 保持不变。如果不是这种情况,请告诉我,我将删除我的答案。 是的,我在 API 上更新了图像,我通过图像的新链接得到了响应。它看起来像一个缓存不更新。我不知道会发生什么。 【参考方案1】:

你可以这样试试。至少我解决了喜欢这个

在您的 .ts 文件中

export class MainLayoutComponent implements OnInit 
public isDesktopDevice: boolean = true;
public sidebarBackgroundClass!: string;


public sideBarOpen: boolean = true; // *sidebar is open by default


ngOnInit(): void 
if (this.isDesktopDevice)  this.sidebarBackgroundClass = this.getLayoutBackground(); 


public getLayoutBackground(): string 
const bgs: string[] = [
  'side1-1',
  'side1-2',
  'side2-1',
  'side2-2',
];

const max = bgs.length;
const min = 0;
const index = Math.floor(Math.random() * (max - min)) + min;
const bgClass = bgs[index];
return bgClass;

然后像这样将照片一张一张地添加到您的 css 文件中:

.css

.side1-1 background-image: linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2)),url('/assets/images/side/side1.1.jpg') !important;

最终添加到你的 html 的类:

<mat-drawer [class]="sidebarBackgroundClass"></mat-drawer> 

【讨论】:

【参考方案2】:
  backgroundImageGenerate()
    
        var myVar = setInterval(() => 
        this.imageApi();
                   
        console.log(this.isStatusCode);

        if (this.isStatusCode.indexOf(true) - 1) 
            clearInterval(myVar);
        
        , 15000)
    


generateImage()
        this.campaignsService.generateImage(this.params.id).subscribe((response: any) => 
            this.backgroundImageGenerate();
        , (error) => 
            this.notify.error('Something went wrong');
            console.log(error)
        )
    
<button type="button" (click)="generateImage()" mat-raised-button color="primary"
      [title]="'ADD_CAMPAIGN_PRODUCT' | translate:lang" style="margin:5px;">
      <i class="material-icons">add_circle</i> 'GENERATE_IMAGE' | translate:lang 
</button>

【讨论】:

【参考方案3】:

您可以将时间戳查询附加到图像 URL 以强制浏览器重新加载图像。这应该不会对托管图像的服务器产生任何负面影响。

更新模板以调用函数:

<img [src]="getLinkPicture()"   >

使用可选的时间戳值计算 URL:

public getLinkPicture() 
     if(this.timeStamp) 
        return this.linkPicture + '?' + this.timeStamp;
     
     return this.linkPicture;

当 URL 改变时。创建一个新的时间戳值。

public setLinkPicture(url: string) 
     this.linkPicture = url;
     this.timeStamp = (new Date()).getTime();

即使 URL 相同,时间戳也会发生变化,这会迫使浏览器重新加载图像。

【讨论】:

你救了我的命,我尝试生成一个新的净化 URL,但不知何故在 ionic+android 上它不起作用

以上是关于如何用角度刷新图像的主要内容,如果未能解决你的问题,请参考以下文章

如何用js控制网页刷新后滚动条保持在原来的位置

以角度订阅后防止刷新

unity如何用脚本刷新窗口

如何用php+ajax实现页面的局部刷新?(转)

Jet Engine 的查询优化是基于统计的,但是它们是如何用链接表刷新的呢?

ThinkPHP框架学习 --- 后台管理系统如何用iframe点击左边右边局部刷新