2017-02-09 12 views
2

У меня есть следующий метод: яваскриптКак получить доступ к «этому» в java-методе?

myFunc = function(callback) { callback.call(this, "hello", "world"); } 

и I'm проходящего объект Java, который реализует метод «вызова». В методе java-вызова я получаю два параметра: «привет» и «мир», но не «это» (конечно). Есть ли способ получить доступ к «этому» из java?

Я поддерживаю java с d3.js, и d3 имеет много обратных вызовов таким образом, и «это» - это где d3 хранит выбор.

Благодаря

+0

Не могли бы вы укажите код Java класса с помощью метода callback(). – Vladimir

+0

Мне не удалось добавить пример кода в этот комментарий, поэтому я добавлю в качестве ответа на вопрос ниже ... –

ответ

0

I'm на самом деле не кодирование в Java, но JRuby. Чтобы сделать пример Java , мне придется упростить мой код ниже. Может быть, это может помочь некоторым. Если нет, Я попытаюсь сделать пример Java.

# Function f1 will call the callback methods cb1 and cb2 with 'this' variable 
# This is just a notation for creating javascript function. It calls 
# @browser.executeJavaScriptAndReturnValue(scrpt), whith the function 
# body (everything between EOT) modified to make a valid javascript script. 
# f1 is a function with 2 arguments cb1, and cb2 which should be the 
# callback functions 
f1 = B.function(<<-EOT) 
    (cb1, cb2) { 
     cb1.call(this, "banana", "milk"); 
     cb2.call(this, "arroz", "feijao"); 
    } 
EOT 

# Proc is a closure. It receives two arguments |food1, food2|. This will 
# become a java object per JRuby´s magic 
proc = Proc.new { |food1, food2| puts "I hate #{food1} and #{food2}" } 

# now call method f1 passing proc as the first argument and the block as 
# the second argument. So cb1 = proc and cb2 = <the block bellow>. Method 
# 'send' grabs the given arguments, converts them to java objects and then 
# calls jxBrowser 'invoke' method with the given arguments. 
f1.send(proc) { |food1, food2| puts "eu gosto de #{food1} e #{food2}" } 

Результат выполнения этого кода:

I hate banana and milk 
eu gosto de arroz e feijao 

Как можно видеть, «это» переменная просто ушла ... Я хотел бы иметь возможность захват «это «переменная как-то, чтобы иметь возможность использовать контекст в блоках. Мне удалось создать обходное решение, позволяющее захватывать «эту» переменную, но требует обертывания блока в другой функции javascript.

Вся идея этого кода заключается в том, чтобы позволить разработчику JRuby написать Ruby-код и получить этот код в jxBrowser без необходимости использования какого-либо javascript. Примеры этого уже можно увидеть, загрузив GEM mdarray-sol или перейдя на https://github.com/rbotafogo/mdarray-sol. Там вы можете увидеть несколько примеров использования d3.js с JRuby.

+0

В вашем примере кода я не вижу, где вы регистрируете объект Java с помощью метода call() используя JxBrowser JavaScript Java Bridge API: https://jxbrowser.support.teamdev.com/support/solutions/articles/9000013062-calling-java-from-javascript – Vladimir

+0

Полагаю, вы не поняли мою проблему. Я все регистрировал, и код работает. Однако, если у меня есть функция javascript, такая как: myFunc = function (callback) {callback.call (это, «Hello Java»);} и я делаю так, как вы предлагаете в javascript: myFunc (window.java), затем в JavaObject Метод «call» Я не могу прочитать переменную «this». –

+0

«this» будет преобразован в JSValue, поэтому ваш метод java() должен выглядеть как вызов (JSValue theThis, String message). – Vladimir

0

Пожалуйста, убедитесь, что вы будете следовать инструкциям на https://jxbrowser.support.teamdev.com/support/solutions/articles/9000013062-calling-java-from-javascript и ввести свой объект Java с call() методом правильно:

Java код:

browser.addScriptContextListener(new ScriptContextAdapter() { 
    @Override 
    public void onScriptContextCreated(ScriptContextEvent event) { 
     Browser browser = event.getBrowser(); 
     JSValue window = browser.executeJavaScriptAndReturnValue("window"); 
     window.asObject().setProperty("java", new JavaObject()); 
    } 
}); 
... 
public static class JavaObject { 
    public void call(JSValue window, String message) { 
     System.out.println(message); 
    } 
} 

JavaScript код:

window.java.call(window, 'Hello Java!'); 

 Смежные вопросы

  • Нет связанных вопросов^_^