събитие pageMod за слушане на отговор от панела

Имам два скрипта за съдържание:

  1. annotationEditor (панел)
  2. editField (pageMod)

Добавката първо иска от потребителя да въведе текст в изскачащ панел, създаден от annotationEditor. Това работи перфектно. Текстът се връща в променливата annotationText. annotationText се съхранява като глобалната променлива savedText, така че editField да има достъп до нея.

След това искам editField да вземе savedText и да направи нещо с него (да го добави към поле за въвеждане). Проблемът е, че имам, че събитието pageMod onAttach се извиква, когато страницата се зареди, а не след "текстът е запазен". Също така не мога да намеря други събития за PageMod Модул. Така че worker.port.emit("editel", [this.annotationAnchor, savedText]) също не работи.

var annotationEditor = panels.Panel({
    width: 220,
    height: 220,
    contentURL: data.url('editor/annotation-editor.html'),
    contentScriptFile: data.url('editor/annotation-editor.js'),
    onMessage: function(annotationText) {
        if (annotationText) {
            // handleNewAnnotation(annotationText, this.annotationAnchor);
            savedText = annotationText;
            annotationEditor.hide();
        }
        annotationEditor.hide();
    },
    onShow: function() {
        this.postMessage('focus');
    }
});

var editField = pageMod.PageMod({
    include: ['*'],
    contentScriptWhen: 'ready',
    contentScriptFile: [data.url('jquery-1.8.3.min.js'), data.url('edit.js')],
    onAttach: function(worker) {
        worker.port.emit("editel", [this.annotationAnchor, savedText]);
    }
});

Опитайте 2: Това по-близо ли е? Изглежда, че все още не работи правилно. Не получавам никакви съобщения в скрипта за съдържание edit.js.

const tabs = require('sdk/tabs');
var editors = [];

function getEditor(tab) {
for (var i = editors.length; i--;)
    if (editors[i].tab===tab) return editors[i];
}

var annotationEditor = panels.Panel({
    width: 220,
    height: 220,
    contentURL: data.url('editor/annotation-editor.html'),
    contentScriptFile: data.url('editor/annotation-editor.js'),
    onMessage: function(annotationText) {
        if (annotationText) {
            var currentEditor = getEditor(tabs.activeTab);
            console.log(currentEditor)
            currentEditor.port.emit("editel",[this.annotationAnchor, annotationText]); 
            annotationEditor.hide();
        }
        annotationEditor.hide();
    },
    onShow: function() {
        this.postMessage('focus');
    }
});

var editField = pageMod.PageMod({
include: ['*'],
contentScriptWhen: 'ready',
contentScriptFile: [data.url('jquery-1.8.3.min.js'),
                    data.url('edit.js')],
onAttach: function(worker) {
    editors.push(worker);
    worker.on('detach', function () {
        detachWorker(this, selectors);
    });
}
});

Това регистрира currentEditor като:

constructor {"contentScriptFile":["resource://jid1-kpzxxdxlwq8qkg-at-jetpack/widget/data/jquery-1.8.3.min.js","resource://jid1-kpzxxdxlwq8qkg-at-jetpack/widget/data/edit.js"],"contentScript":null,"port":{}}

Правилно ли изглежда?

Тук е и скриптът за съдържание - edit.js. Очевидно в момента това не прави много. Първата стъпка е да го накарате да улови съобщението от main.js.

self.port.on("editEl", function(el) {
$(el[1]).val(el[0]);
});

person aturc    schedule 11.11.2014    source източник


Отговори (1)


Трябва да направите работника глобална променлива. След това направете worker.port.emit в onMessage на панела.


Редактиране: по-добрият подход е да се създаде масив от работници, както е показано в този пример в документите. След това, за да намерите работника на текущия раздел по-късно, можете да направите следното:

const tabs = require('sdk/tabs');

var getWorker = function(tab) {
  for (var i = workers.length; i--;)
    if (workers[i].tab===tab) return workers[i];
}

var currentWorker = getWorker(tabs.activeTab);
person willlma    schedule 11.11.2014
comment
Така че основно това, което казвате, е, че декларирам работника като глобална променлива, след това го дефинирам в събитието editField onAttach и накрая го извиквам в събитието annotationEditor onMessage? - person aturc; 12.11.2014
comment
Правилно. Но това е много наивен подход, тъй като ще имате повече от един работник. Документацията за SDK е много добра и си струва да прочетете примерите им. На същата страница, към която сте направили връзка, има страхотен пример за това как да управлявате множество работници. - person willlma; 12.11.2014
comment
Бихте ли могли да погледнете втори опит в кода по-горе?! Мерси - person aturc; 13.11.2014
comment
Има ли възможност да разгледате кода ми още веднъж. Актуализирах го, за да опитам да включа вашите предложения. - person aturc; 13.11.2014
comment
Излъчвате "editel", но слушате "editEl" (главно E). Струните трябва да са еднакви. - person willlma; 13.11.2014
comment
Благодаря много, че най-накрая го направи! - person aturc; 14.11.2014