Объект удаляется или частично сворачивается при компиляции в расширенном режиме — Google Closure Compiler

Я использую angular с Closure, и у меня возникают проблемы с аннотацией @export. В частности, возможность экспортировать определения свойств. Я думал, что у меня что-то работает со следующим кодом, но он кажется очень темпераментным.

/**
 * @export
 * @constructor
 */
com.MyController = function() {
   this.greeting = 'hello';
   this.goodbye = 'bye'
};

/**
 * @export
 */
com.MyController.prototype = {

    'sayGoodbye': function() {
        return this.goodbye;
    },

    'sayHello': function() {
        return this.greeting;
    }
};

Иногда компилятор экспортирует все методы прототипа, в других случаях он экспортирует только "sayGoodbye", а в других случаях он полностью сворачивает весь объект, определенный в прототипе.

Я знаю, что я могу сделать это:

/**
 * @export
 */
com.MyController.prototype.sayHello = function() {
    return this.greeting;
};

Что работает, однако становится очень трудоемким печатать это все время, когда оно становится менее читаемым.

Я знаю, что в компиляторе есть опция setExportLocalPropertyDefinitions, но в версии кода с открытым исходным кодом в настоящее время нет флага для установки этого - я возился с исходным кодом Java, чтобы попытаться установить это, но безуспешно, поэтому далеко.

Обновление: кажется, что методы прототипа (например, sayGoodbye) будут экспортированы, если в несвязанном классе есть другой метод с таким же именем. Я предполагаю, что его экспортируют не потому, что он определен как строка, как я изначально надеялся, а из-за некоторой путаницы между этими двумя несвязанными методами?


comment
Поскольку методы-прототипы указаны в кавычках, их ни в коем случае нельзя переименовывать или удалять. Это похоже на ошибку. Можете ли вы опубликовать проблему?github.com/google/closure-compiler/issues   -  person Chad Killingsworth    schedule 30.11.2014
comment
спасибо, только что разместил здесь проблему: github.com/google/closure-compiler/issues/ 722   -  person Alec Hewitt    schedule 01.12.2014


Ответы (1)


Убедитесь, что сигнатуры методов для export определены:

Код, использующий аннотацию @export, должен либо

  • включить closure/base.js или,

  • определите как goog.exportSymbol, так и goog.exportProperty с одной и той же сигнатурой метода в их собственной кодовой базе.

Ссылки

person Community    schedule 30.01.2015