Вызов функции внутри paperscript извне

У меня есть 3 файла JS.

  1. main.js
  2. карта.js
  3. легенда.js

map.js и legend.js — это сценарии для двух разных холстов. Они вызываются из HTML следующим образом.

<script type="text/javascript" src="main.js"></script>
<script type="text/paperscript" src="map.js" canvas="mapCanvas"></script>
<script type="text/paperscript" src="legend.js" canvas="legendCanvas"></script>

в map.js у нас есть функция с именем drawMap()

в legend.js у нас есть функция с именем drawLegend()

очевидно, они манипулируют своими холстами.

Требование: я хочу вызывать эти функции из main.js.

Я видел этот пост Paperscope и paperjs

и следовали этим инструкциям https://groups.google.com/forum/#!msg/paperjs/C6F0XFlplqM/_67AMqCR_nAJ

Но я не уверен, как и где создавать и вызывать объекты PaparScope.

До сих пор не работает.

Это близко: Paper.js Interoperability

А мне нужно наоборот.


person Moe Sweet    schedule 17.08.2015    source источник


Ответы (1)


Вам нужно экспортировать функции, которые вы хотите вызывать извне, например:

window.drawMap = drawMap;
window.drawLegend = drawLegend;

Затем они становятся глобальными, и вы можете вызывать их извне.

Более элегантным способом может быть определение контейнера в глобальной области видимости, например. (в обычном теге сценария JavaScript, который выполняется перед кодом PaperScript, например, в вашем main.js):

var globals = {};

Затем таким же образом получите доступ и заполните этот контейнер из PaperScript:

globals.drawMap = drawMap;
globals.drawLegend = drawLegend;

После этого вы можете использовать их из любого JavaScript или PaperScript:

globals.drawMap();
globals.drawLegend();

Обновление:

Поскольку вы работаете с более чем одним PaperScope (созданным кодом PaperScript, привязанным к отдельным холстам), вам необходимо активировать правильную область перед вызовом функции, которая работает с данным холстом. Лучше всего делать это непосредственно в функциях drawMap() и drawLegend(), чтобы не волноваться при вызове извне.

Внутри PaperScript this указывает на область действия, поэтому вы можете сделать что-то подобное вне функции:

var scope = this;

а затем внутри функции:

scope.activate();
person Jürg Lehni    schedule 17.08.2015
comment
Привет, Юрг, Спасибо, что дал ответ от себя. Теперь я могу получить доступ к функции снаружи, но холст не отвечает. (Та же функция, вызываемая внутри map.js, работает). Я считаю, что у меня проблема с масштабом. Я пробовал это... pscope1 = PaperScope.get(1) pscope2 = PaperScope.get(2) pscope1.activate() pscope1.view.update() но я получаю нули из PaperScope.get. - person Moe Sweet; 18.08.2015
comment
О да, при работе с разными областями вам нужно сначала активировать правильную область. Лучше всего сделать это непосредственно в функциях drawMap() и drawLegend(), чтобы не волноваться при вызове извне. Внутри PaperScript this указывает на область действия, поэтому вы можете сделать что-то вроде этого вне функции: var scope = this;, а затем внутри функции: scope.activate();. - person Jürg Lehni; 18.08.2015
comment
Я соответствующим образом скорректировал основной ответ. - person Jürg Lehni; 18.08.2015
comment
Большое спасибо, Юрг. Я больше не мог его тестировать, потому что меня заменил другой разработчик проекта. Но это будет полезно для него, или любого будущего проекта для меня. - person Moe Sweet; 21.08.2015