angular - Angular如何使用谷歌存储api
问题描述
我不会使用 chrome 的存储扩展。我不断得到: chrome.storage 未定义。
即使我得到错误,它仍然存储我想要存储的数组。这个块以某种方式工作:
chrome.storage.local.set({'projectsToNotif': projectsForNotif}, function() {
console.log('Projects to be notified are marked');
});
我有一个清单文件,其中包含以下内容:
{
"name": "Juju Web App",
"short_name": "iBrand Web App",
"display": "standalone",
"description": "App for internal use.",
"permissions": [
"storage"
]
}
解决方案
我知道问题出在哪里,您的 manifest.json 文件中缺少一些字段,用这些新字段更新了它们。
{
"manifest_version": 2,
"name": "Juju Web App",
"description": "App for internal use.",
"display": "standalone",
"version": "1.0",
"browser_action": {
"default_icon": "icon.png",
"default_popup": "index.html"
},
"permissions": [
"storage"
],
"content_security_policy": "script-src ‘self’ ‘unsafe-eval’; object-src ‘self’",
"web_accessible_resources": [
"assets/css/* ",
"assets/js/*",
"assets/fonts/*"
]
}
现在为了访问 chrome 存储,我建议构建一个处理它的服务,这里是处理 chrome 存储 API 的基本服务。
如果您不想构建自己的服务,可以使用这个包ng2-chrome-storage
import { Injectable, NgZone, Optional } from '@angular/core';
export class Settings {
storeKey: string = 'hhappsettings'; // identifier to be used as a key for storage
data: any = {};
}
@Injectable({
providedIn: 'root'
})
export class ChromeStorageService {
storeKey = ''; // chrome storage key
config: any; // holds settings
constructor(private zone: NgZone, @Optional() _settings: Settings) {
let usethisSettings = (_settings)? _settings : new Settings();
this.config = usethisSettings.data;
this.storeKey = usethisSettings.storeKey;
}
// to be used inside a resolver
load() {
return this.getChrome(this.storeKey, this.config).then((data: any) => {
this.config = data;
return data;
});
}
// remove a key
remove(key: string): Promise<boolean> {
return new Promise((resolve, reject) => {
if (window['chrome'] !== undefined && window['chrome'].storage !== undefined) {
window['chrome'].storage.sync.remove(/* String or Array */key, () => this.zone.run(() => {
resolve(true);
}));
} else {
localStorage.removeItem(key);
resolve(true);
}
});
}
getChrome(key: string, defaults = {}): Promise<any> {
return new Promise((resolve, reject) => {
if (window['chrome'] !== undefined && window['chrome'].storage !== undefined) {
let saveObj = {};
saveObj[key] = defaults;
window['chrome'].storage.sync.get(/* String or Array */saveObj, (data) => this.zone.run(() => {
resolve(data[key]);
}));
} else {
let object = (localStorage.getItem(key) === null) ? defaults : JSON.parse(localStorage.getItem(key));
resolve(object);
}
});
}
}
希望这回答了你的问题:)。
推荐阅读
- ios - 如何识别 iOS 应用程序是否连接到特定的 WiFi 网络?
- javascript - 如何将变量值分配给ajax块中的xml字段
- java - 在尝试“apt install openjdk-8-jre-headless”和“apt install openjdk-8-jdk”后,java 不可用
- django - 有没有办法在 django 中扩展创建的模型字段另一个模型?
- angular - Angular 6 基于角色的身份验证
- reactjs - 渲染后从 HTML 中删除自动播放
- mongodb - 如何聚合 ObjectId 对数组及其相关集合
- rest - 在 REST API 调用中,如果结果为空,我们应该返回什么
- node.js - 如何使用 MERN 堆栈应用程序上传对象数组,其中某些对象包含文件?
- javascript - 仅当变量包含值时才创建包含变量的数组