Поведение — предпочтительный способ совместного использования кода между элементами 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'); } });
Удачного кодирования!
Фото: Ронни Роллер