Поведение — предпочтительный способ совместного использования кода между элементами Polymer. Но что, если само поведение требует параметр от элемента, который его использует?

Давайте рассмотрим следующий пример: у нас есть LogBehavior, который позволяет элементам выводить сообщения на консоль. Каждое сообщение журнала должно содержать указание, какой элемент инициировал его — что-то вроде этих строк:

LogBehavior = {
  log: function(msg) {
    console.log('<ELEMENT> says: ' + msg);
  }
};

Возможным решением было бы полагаться на свойство, которое, как мы предполагаем, существует в элементе, используя поведение:

LogBehavior = {
  log: function(msg) {
    console.log(this.elementName + ' says: ' + msg);
  }
};
---
Polymer({
  is: 'my-logging-element',
  properties: {
    elementName: {
      type: String,
      value: 'My logging element'
    }
  },
  behaviors: [ LogBehavior ],
  ready: function() {
    this.log('Hi');
  }
});

К сожалению, это нарушает разделение интересов, потому что теперь поведение делает предположения о своих пользователях. Не лучшая идея…

Подводя итог: нам нужно ввести параметр, специфичный для элемента, и убедиться, что это действительно происходит. Эти требования в значительной степени кричат ​​​​для фабрики! Вот так:

LogBehavior = function(elementName) {
  if (!elementName) {
    throw new Error('You must provide an elementName!');
  }
  return {
    log: function(msg) {
      console.log(elementName + ' says: ' + msg);
    }
  }
};
---
Polymer({
  is: 'my-logging-element',
  behaviors: [
    LogBehavior('My logging element')
  ],
  ready: function() {
    this.log('Hi');
  }
});

Удачного кодирования!

Фото: Ронни Роллер