Расширение родного JsType - PullRequest
       21

Расширение родного JsType

0 голосов
/ 19 сентября 2019

Я расширяю собственный JsType, который я объявил, на основе snap svg.Мой подкласс TestWidget2 расширяет собственный JsType Rect и имеет дополнительные объявленные методы, такие как «move».

Я создаю экземпляр с помощью метода Js utils Js.uncheckedCast ().Когда я пытаюсь вызвать метод move из моего подкласса, я получаю следующую ошибку:

Uncaught TypeError: testWidget2_0_g$.move_0_g$ is not a function

Snap svg имеет метод rect (x, y, width, height, rx, ry) для создания прямоугольников svg.У меня есть JsType, который выглядит следующим образом:

@JsType(isNative = true, namespace = "Snap")
public class Paper extends Element {

public native Element circle (float x, float y, float r);

public native Rect rect (float x, float y, float width, float height, float rx, float ry);

Мой Test2Widget:

public class TestWidget2 extends Rect {

public  Paper getSvg() {
    return svg;
}

public  void setSvg(Paper svg) {
    this.svg = svg;
}

private Paper svg;


/**
 * tests moving with current matrix transformation
 * @param x
 * @param y
 */


public void move (int x, int y) {
    au.com.guml.ui.components.common.client.jsni.Matrix matrix = JSNI.getScreenCTM(svg.getNode());
    Point point = JSNI.createSVGPoint(svg.getNode());
    point.setX(x);
    point.setY(y);
    point = point.matrixTransform(matrix.inverse());
    Attributes attributes = attr();
    attributes.setX(point.getX());
    attributes.setY(point.getY());
    attr(attributes);
}



}

Я также пытался сделать TestWidget2 нативным JsType, но затем я попытался вызвать методы Snapна него, как attr (), и затем я получаю ту же ошибку.

Я предполагаю, что это потому, что Snap ничего не знает о моем классе TestWidget2, когда он создает прямоугольник svg.Я не понимаю внутреннюю работу JsInterop.

Я не знаю, как решить эту проблему, но, наверное, мне нужно понять, как JsInterop конвертирует элементы Dom?Любая помощь очень ценится.

ОБНОВЛЕНИЕ: я вручную скопировал, используя jsni, атрибуты из привязанного нативного объекта в мой подкласс через конструктор.См. Метод конвертирования ниже:

public SnapWrapper(Paper svg) {
    this.svg = svg;
    Rect rect = svg.rect(0,0, 500, 500, 0,0);
    convert(this, rect);
}


@Override
public final native void convert(io.ease.test.model.client.Element e,       
Rect rect) /*-{

    for (var attr in rect) {
        e[attr] = rect[attr];
    }

}-*/;

Хотя это работает, похоже, это побеждает всю цель использования JsInterop и аннотаций.Мне кажется, что в JsInterop есть ошибка, и она должна справиться с этим простым сценарием.В этом случае я предполагаю, что я делаю что-то неправильно.

...