ローカル記憶域を使ってオブジェクトをwebextensionsに格納する必要があります。以下に簡単なコードを示します(私はtitle
とcontent
を固定文字列としてここに入力します)。ウェブエクステンション:ストレージの長さを取得してオブジェクトを反復する方法
オブジェクトをローカルストレージに挿入した後、HTMLテーブルの最後の行のHTMLページにオブジェクトを動的に表示する必要があります。
これを行うには、ストレージに格納された最後のオブジェクトにアクセスするためにテーブルの長さ(達成できません)とストレージの長さ(実現できませんでした)が必要です。 HTMLテーブル。
私は2つの問題に直面しました。私はストレージの配列を扱っていないので、格納されたアイテムの長さを取得する方法と、最後に追加されたアイテムとアイテムにアクセスする方法(インデックス番号を使用して配列にアクセスするなど)はわかりません。私はwebextensionに書き直しています。そこで、アイテムをオブジェクトの配列としてストレージに格納していました。私は本当にwebextensionでこれを行うことはできませんでしたし、あなたの助けが必要です。私は本当に間違ったことをしない限り、最小限の変更で書き直すことを好む。私がやっていることは、ストレージ内の最後のアイテムを取得し、HTMLテーブルに新しい行を作成して追加することです。アイテムをストレージに保存してHTMLテーブルに表示します。
コンソールで、rows
をコンソールに記録すると、単語object
が表示されます。オブジェクトを1つずつアクセスしてプロパティを取得してHTMLページに表示するにはどうすればよいですか?
お願いしますか?
1)index.js
function insertRow()
{
var title = "XYZ" //I'm using fixed value but this is can be multiple objects read from the user whenever he inserts a new objects.
var content = "X";
storeRow(title,content);
}//end insertRow
//---------------------------------------------
function onError(error) {
console.log(`Error: ${error}`);
}
//----------------------------------------------
function onGot(rows){
console.log("onGot: "+rows.length); //row.length - does not work
}
//-------------------------------------
function storeRow(title,content)
{
var rows = {}; //define object
rows.title = title;
rows.content = content;
var storingRow = browser.storage.local.set(rows); //insert the object to the storage.
console.log("row inserted");
storingRow.then(() => {
displayRow(rows);
}, onError);
}//end storeRow
//--------------------------------------
function displayRow(rows)
{
let gettingItem = browser.storage.local.get();
gettingItem.then(onGot, onError);
}//end displayRow
2)manifest.json
:
{
"manifest_version": 2,
"name": "test",
"version": "1.0",
"background": {
"scripts": ["index.js"]
},
"permissions":[
"activeTab",
"storage"
],
}
UPDATE: SDKで、具体的には、私は、ストレージアレイを定義するために、これを行うために使用される。
if(!info.storage.myStorage)
{
info.storage.myStorage = []; //declare a new storage.
}//end if
次に、オブジェクトを押します。 var myObject = {}; //オブジェクトを定義します。 row id
に基づい
myObject.title = "cccc";
myObject.content="zzzz";
info.storage.myStorage.push(myObject);
その後、私はできedit
、update
、およびHTMLページからdelete
ストレージ項目。アイデアは、アイテムがストレージに格納された後、HTMLページに表示されます。たとえば、edit
の各行にリンクがあり、ユーザーがクリックすると、edit
ボタンのid
(行番号)のストレージアレイindex
が識別されます。しかし、Web拡張では配列がありません。ユーザーがedit
をクリックしたときには、記憶要素をrow
の番号で識別する必要があります。これをどうやって行うのか考えていますか?もし何もしなければ、代替案は何ですか?
行を保存するたびに、同じデータ 'title'と' content'を上書きしているように見えます。配列を配列として格納するために 'storage.local'で使用するキー名を選ぶだけの理由はなぜですか? '.push()'や 'pop()'などのたびに保存したいのであれば、それを行う関数を定義するか、それらのメソッドを呼び出すときにそれを行う新しいObjectを作成するだけです。 – Makyen
あなたは各オブジェクトのキーを意味しますか? 'title'と' content'はフォームから読み込まれ、ユーザからの入力として取得されるため、キーを選択できません。私はこの単純な例のように、これらの値を手動で入力しません。では、ユーザーが入力するたびに自動キーを割り当てる方法は?私が望むのは、ユーザーが任意の数の 'title'と' content'を入力できることです。私は、これらの値を編集、削除、更新したいと思います。編集、削除、更新はボタンで、クリックイベントがあります。それらがクリックされると、それらに対応するストレージ内の行/インデックスまたはキーを参照する必要があります。 – user6875880
編集、削除、または更新ボタンがクリックされたときのすべては、行インデックス(ボタンのIDから取得)です。次に、そこからストレージを参照して更新または削除します。私は配列なしでこれを行うことができませんでした。あるいは、配列なしでこれをどうやって行うことができるか、もっと明確にする必要があります。 – user6875880