Вычислительная привязка не работает с щелчком (Polymer)
<template is="dom-repeat" items="{{myItems}}">
<div on-click="{{ComputedBindingFunction(item)}}">Foo</div>
</template>
Это приводит к ошибке:
метод слушателя {{ComputedBindingFunction(item)}}
не определен
Не следует ли выполнять функцию вместо того, чтобы буквально пытаться присоединить имя функции с {{}}
до on-click
в соответствии с docs?
Обратите внимание, что ComputedBindingFunction
возвращает функцию.
Ответы
Ответ 1
Пример, показанный в документации, на которую вы ссылаетесь, не предназначен для вызова методов или событий запуска, это для использования вычисленных привязок.
то есть.
<div>{{ComputedBindingFunction(item)}}</div>
Если вы пытаетесь вызвать событие, удалите фигурные скобки:
<div on-click="ComputedBindingFunction"></div>
...
Доступ item
из инициированного события
ComputedBindingFunction: function(event){
_ComputedBindingFunction(event.model.item)
}
Ответ 2
Во-первых, атрибуты для прослушивателей событий (например, on-click, on-tap и т.д.) не позволяют вычислять привязки как аргумент, а только строку.
Во-вторых, даже если бы они и сделали, что было бы здорово в будущем, ваш пример все равно не сработает, потому что вы возвращаете функцию из вычисленной привязки, а не строки.
Вместо этого ваша вычисленная функция должна возвращать имя функции, которую вы хотите вызвать, которая определяется с помощью аргументов, предоставляемых при запуске события.
Пример:
атрибут обработчика событий html-полимера
<div on-click="{{computeFunction(a, b}}">Button</div>
computeFunction создает новую функцию "добавить" и возвращает имя этой функции в виде строки.
computeFunction: function(a, b) {
functionName = "add";
this[functionName] = function() {
// Does whatever you want with arguments, a, b
// Like maybe adding them together.
return a + b
}
return functionName;
}
add: function(a, b) {
return a + b;
}
Таким образом, функция, называемая "add", которая вызывается, когда происходит событие on-click, всегда будет использовать новые переменные "a" и "b", назначенные ей.
До тех пор, пока это не будет доступно, чего никогда не будет. Вы можете хранить параметры в атрибуте элемента, который запускает событие.
<div on-click="someFunction" someFunction="{{item}}">Button</div>
someFunction: function(e) {
// Current target is the node that fired the event,
// It has our stored parameter "{{item}}" as a value of "someFunction"
var item = e.currentTarget.getAttribute('someFunction');
// Do something with item
console.log(item);
}
Как вы можете видеть, я сохранил элемент в атрибуте с именем функции, вызванной событием on-click.
Таким образом, легко определить, какие аргументы будут переданы функции, просто просматривая html, и работает для нескольких обработчиков событий в одном элементе.