Как получить доступ к параметрам внутри apos.define? - PullRequest
0 голосов
/ 25 июня 2018

apostrophe-workflow имеет следующее:

public / js / user.js

apos.define('apostrophe-workflow', {

  [...]

  construct: function(self, options) {

    self.locales = options.locales;
    self.locale = options.locale;
    [...]

Я долго искал и не смог найти причину, почему этот метод конструкции имеетдоступ к объекту options.Я попытался browserCall, но не уверен, как правильно его использовать.

Мои активы также выдвигаются с помощью pushAsset.Но они не имеют доступа к опциям после apos.create.

Редактировать: Пример сценария:

Простой модуль, который передает один скрипт в браузер.

module / index.js

construct: function(self, options) {
  self.pushAsset('script', 'name', {when: 'always'});
}

И принимает одну опцию.

app.js

modules: {
  'module': {
    option: 'Option'
  }
}

Скрипт должен использовать эту опцию на construct.

module / public / js / script.js

apos.define('module-script', {
  construct: function(self, options) {
    console.log(options.option); // Print 'Option' to console.
  }
});

Другой модуль будет вызывать apos.create('module-script').

Надеюсь, это понятно.

1 Ответ

0 голосов
/ 26 июня 2018

Вы можете решить (как минимум) это двумя способами в зависимости от желаемой структуры.

1.Явные параметры браузера

Вы можете явно передать параметры браузеру из конфигурации модулей, обернув их в объект browser из корня конфигурации модуля.

в lib/modules/layout-widgets/index.js

module.exports = {
    extend: 'apostrophe-widgets',
    label: 'Layout',
    browser: {
      coolArray: [3, 2, 1]
    }
  }

Это будет объединено с параметрами, автоматически передаваемыми JS модуля на стороне браузера.

, затем в /lib/modules/layout-widgets/public/js/always.js

apos.define('layout-widgets', {
  extend: 'apostrophe-widgets',
  construct: function (self, options) {
    self.play = function ($widget, data, options) {
      console.log(self.options.coolArray);
    }
  }
});

2.Super'ing getCreateSingletonOptions

Если вам не нравится синтаксис отделения опций браузера от ваших основных опций, вы всегда можете переопределить метод, отвечающий за настройку опций модуля на стороне браузера, скопировав его,вызывая его и добавляя к нему

в lib/modules/layout-widgets/index.js

module.exports = {        
  extend: 'apostrophe-widgets',        
  label: 'Layout',
  coolArray: [3,2,1],
  construct: function(self, options) {

    // copy the method
    var superGetCreateSingletonOptions = self.getCreateSingletonOptions;

    // redefine it
    self.getCreateSingletonOptions = function (req) {

      // invoke the original method and save the result
      var browserOptions = superGetCreateSingletonOptions(req);

      // add on to the default results with whatever you want
      browserOptions.coolArray = self.options.coolArray;
      browserOptions.somethingElse = 'hey this is fun';

      return browserOptions;
    };
  }
};

, затем снова в /lib/modules/layout-widgets/public/js/always.js

apos.define('layout-widgets', {
  extend: 'apostrophe-widgets',
  construct: function (self, options) {
    self.play = function ($widget, data, options) {
      console.log(self.options.coolArray);
      console.log(self.options.somethingElse);
    }
  }
});
...