【发布时间】:2021-04-23 12:13:51
【问题描述】:
我正在开发一个简单的书签 chrome 扩展并使用 Angular 作为框架,可能不是此类任务的最佳选择,但我想尝试一下。
在这篇文章之后here 这一切似乎都是合乎逻辑的。但是,我开始遇到非常奇怪的问题。
当我单击书签图标时,书签视图输入未填充来自 chrome API 的值(似乎 Angular 不会启动更改检测或类似的东西,我是前端和 Angular 的新手一般的)。为了更改视图,我需要单击其中一个输入,然后在视图更改后单击另一个输入。
另一个观察结果是,当我使用<select> 输入时,当我选择一个输入不会更改的选项时,我需要单击其中一个文本输入才能看到更改。我相信必须填写输入,因为代码chrome.tabs.query 在组件的构造函数中执行。我怀疑这段代码在 Angular 之外运行,因此 Angular 不会触发更改检测,所以我尝试了ChangeDetectorRef.detectChanges(),当我单击书签图标时它可以更新输入,但这并没有解决问题<select>,所以问题可能更深入。
这是组件代码:
import {Component, OnInit} from '@angular/core';
@Component({
selector: 'app-add-bookmark',
templateUrl: './add-bookmark.component.html',
styleUrls: ['./add-bookmark.component.css']
})
export class AddBookmarkComponent implements OnInit {
url: string = "";
directory: string = "";
description: string = "";
tags: string[] = [];
image: string;
recentFolders = [];
folderId: string = "2";
constructor() {
chrome.tabs.query({active: true, currentWindow: true}, tabs => {
let activeTab = tabs[0];
this.url = activeTab.url;
this.description = activeTab.title;
this.image = activeTab.favIconUrl;
// ChangeDetectorRef.detectChanges(); //this worked and inputs are updated but It didn't solve the issue with Select.
});
}
}
HTML:
<div class="container align-items-center p-2">
<div class="row align-items-center">
<div class="col-sm-1">
<div class="mb-1">
<img *ngIf="image" [src]="image"/>
</div>
<div class="mb-1">
<label for="url" class="form-label">URL</label>
<input type="text"
class="form-control form-control-sm" id="url"
aria-describedby="url" [(ngModel)]="url" name="url">
</div>
<div class="m-1">
<label for="description" class="form-label">Description</label>
<textarea type="text" class="form-control form-control-sm" id="description" aria-describedby="desc"
[(ngModel)]="description" name="description"></textarea>
</div>
<div class="m-1">
<label for="description" class="form-label">Select Folder:</label>
<select id="selected_dirs" class="form-select form-control form-control-sm"
aria-label="Default select example"
name="directory">
<option *ngFor="let f1 of recentFolders" [ngValue]="f1.id">{{f1.name}}</option>
</select>
</div>
<div class="mt-4 mb-2">
<button class="btn btn-primary btn-sm" (click)="openManager()">Open Manager</button>
<button class="btn btn-dark btn-sm m-2" (click)="addBookmark()">Add bookmark</button>
</div>
</div>
</div>
</div>
这是一个视觉演示
应该填写URL和描述
单击输入字段,没有任何反应
点击另一个输入框就可以了
感谢您花时间阅读这个长长的问题。
【问题讨论】:
-
以防万一您不知道,弹出窗口是一个单独的窗口,因此它有自己独立的开发工具:在弹出窗口内右键单击并在菜单中选择“检查”。在 devtools 中,您可以检查控制台中的错误并调试您的代码。
标签: javascript angular google-chrome google-chrome-extension