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