2016-08-14 3 views
1

Использование https://pub.dartlang.org/packages/js интерфейс класса Js таким образом, работает отлично:JS пакет - интерфейс объекта

@JS() 
class ObjJS { 
    external ObjJS(); 
    external String fullName(); 
} 

Теперь я хочу, чтобы выставить метод в другом классе, так что плата за проезд я только решил эту проблему с дублирование метода. Это работает, но будет расти, когда будет добавлено больше методов. Нужен какой-то миксин или наследование, но не принято для этого класса interop. jselem это имя библиотеки

class ObjDart { 
    jselem.ObjJS _objJS = new jselem.ObjJS(); 

    String fullName(){ 
    return _objJS.fullName(); 
    } 
} 

Есть более элегантные способы решить эту проблему?


Обновление для лучшей иллюстрации

вещей работает, вопрос касается, есть ли более эффективные способы разоблачить методы/свойства сопряженного класса Javascript. Приведенный выше пример является минимальным, поэтому не является иллюстративным. Чтобы получить лучшую иллюстрацию, возьмите ChartDataSet отсюда: https://github.com/google/chartjs.dart/blob/master/lib/chartjs.dart Просто для иллюстрации, скажем так, на стороне Дарта создан класс Дарта StreamChartDataSet, который добавляет функции для чтения онлайн-данных с URL-адреса. Поскольку StreamChartDataSet не могут наследовать или подмешать от ChartDataSet раствора выше, дает:

class StreamChartDataSet { 
    ChartDataSet _chartDataSet; 
    ... 
    String get label => _chartDataSet.label; 
    set label(fial String v) => _chartDataSet.label(v); 
    ... 
} 

Это много методов и чисто механическую работу. Когда закончите с этим, просто надеюсь, что ChartSettings идет без изменений :-) Я работаю с другими вещами, но используя Charjs.dart для иллюстрации.

+1

Я не понимаю, в чем проблема. –

+0

Привет, Прежде всего, ссылка в вопросе была неправильной, теперь исправлена. Это касается пакета js 0.6, а не дротика: js. Минимальный пример не был иллюстративным, поэтому я попробовал один, который, мы надеемся, более наглядный. –

ответ

2

Чтобы уточнить, вы хотите расширить аннотированный класс @JS(), это правильно? Я не думаю, что работает, так как класс @JS() не существует до компиляции.

пара вариантов:

  1. Кто-то может разработать генератор кода, который выглядит на @JS() -annotated класса, и снимите шаблонного, делая в основном то, что вы делаете для вас. Не супер элегантный, но, по крайней мере, помогает.

  2. Вы можете указать ошибку в пакете: js для поддержки расширения.

По-моему, хотя я очень сторонник композиции над расширением, особенно над классами, которыми вы напрямую не управляете. Например, если изменения JS-API от FULLNAME к ПгвЬЫату и LastName, вы можете сохранить тот же API, просто изменив поглотитель:

String fullName() => _js.firstName + _js.lastName; 

Это до вас, хотя.

+0

Спасибо за ответ. Ага, да, класс генерируется, это очевидно при отладке. На самом деле многие случаи могут быть решены с помощью агрегации, а затем при методе типа ChartDataSet get chartDataSet => _chartDataSet'. Я пойду за этим другом. 1) можно сделать легко. –