Como passar um argumento para um Módulo Javascript?
-
29-10-2019 - |
Pergunta
Desejo usar um Módulo Javascript (JSM) em uma única janela do meu aplicativo Xul, para que eu possa carregar o recurso conforme necessário.
Mas, preciso passar a janela para o JSM, e não sei como fazer.Segue minha tentativa:
Em meu resource.jsm :
var EXPORTED_SYMBOLS = ["hello"];
function hello(win) {
win.alert("ALERT FROM JSM!");
}
chamando na minha janela com:
Components.utils.import("resource://module/resource.jsm");
hello(window);
mas eu entendo:
a vitória é indefinida
no resource.jsm.
Alguma ideia de como fazer funcionar?
Solução
Pode estar causando problemas o fato de você ter nomeado o parâmetro da função hello
como window
.Embora janela não seja uma palavra reservada, a maioria dos ambientes de navegador a trata como uma espécie de constante não atribuível.Experimente:
function hello( obj ) {
obj.alert("ALERT FROM JSM!");
}
em seu módulo e, em seguida, invoque-o com hello(window)
, hello(document.window)
ou hello(this)
Depois de ler a documentação do módulo Javascript, parece que você precisará criar um objeto dentro do módulo e, em seguida, alterar sua propriedade por referência.Então, em seu JSM:
var EXPORTED_SYMBOLS = ["params", "hello"];
params = {
win: this
};
function hello() {
params.win.alert("ALERT FROM JSM!");
}
Então, você chamaria atribuindo primeiro a janela a esse parâmetro e, em seguida, chamando a função:
Components.utils.import("resource://module/resource.jsm");
params.win = window;
hello();
Observação: não estou familiarizado o suficiente com JSMs para saber se há uma maneira melhor de fazer isso, mas deve funcionar.