dart dart-webui polymer

¿Cómo transfiero datos arbitrarios a una función de controlador de eventos de clic desde un componente web de polímero de Dart?



dart-webui polymer (3)

En la interfaz de usuario web de Dart, fue posible pasar datos arbitrarios para funcionar en respuesta a eventos, por ejemplo, el siguiente fragmento pasa el valor 2 al método de increment(int incBy) en respuesta al evento de clic del botón:

<!-- Web UI --> <element name="x-click-counter"> <template> <button on-click="increment(2)"> <!-- passing a value of 2 --> Click me </button> </template> </element> <script> import ''package:web_ui/web_ui.dart''; class CounterComponent extends WebComponent { void increment(int incBy) { // accept the value of 2 count = count + incBy; } } </script>

En Polymer (y Polymer.dart), el atributo de evento de clic requiere una versión de cadena del nombre de la función, en lugar de una llamada a la función real. Esto se describe en la página de documentos de polímeros como:

El valor de un atributo de controlador de eventos es el nombre de cadena de un método en el componente. A diferencia de la sintaxis tradicional, no puede poner código ejecutable en el atributo.

Usando polymer.dart, esto se ve así:

<polymer-element name="x-click-counter"> <template> <button on-click="increment"> <!-- can''t pass a value of 2, as you need to pass a string --> Click Me </button> </template> </polymer-element> <script> import ''package:polymer/polymer.dart''; @CustomTag("x-click-counter") class CounterComponent extends PolymerElement with ObservableMixin { @observable int count = 0; void increment(Event event, var detail, var target) { // How do I pass 2 to this function? count = count ++; } } </script>

Pregunta: ¿Cómo paso un valor arbitrario a la función de increment ?


Dart y Polymer.dart han cambiado desde la respuesta de Chris. Aquí está el código actualizado para Dart v1.0:

<polymer-element name="x-click-counter"> <template> <button on-click="{{increment}}" data-incby="2"> <!-- now passing the value as a data attribute --> Click Me </button> <span>{{count}}</span> </template> </polymer-element> <script type="application/dart"> import ''package:polymer/polymer.dart''; import ''dart:html''; @CustomTag("x-click-counter") class CounterComponent extends PolymerElement { @observable int count = 0; CounterComponent.created() : super.created(); void increment(Event event, var detail, var target) { int incBy = int.parse(target.attributes[''data-incby'']); // extract the value 2 count = count + incBy; } } </script>


Mi solución para Polymer 0.11.0 + 5

element.html

<link rel="import" href="../packages/polymer/polymer.html"> <polymer-element name="dp-element"> <template> <div class="row"> <ul> <template repeat="{{ item in items }}"> <li on-click="{{load}}" data-incby="{{item}}">{{ item }}</li> </template> </ul> </template> <script type="application/dart"> import ''package:polymer/polymer.dart''; import ''view.dart''; import ''dart:html''; @CustomTag(''dp-element'') class DpElement extends PolymerElement { @observable List<String> items; DpElement.created() : super.created(){ } void load(Event event, var detail, var target) { String incBy = target.attributes[''data-incby'']; print(incBy); } }


Puede usar los atributos de data- html para pasar datos adicionales y luego acceder a ellos a través del parámetro de target .

data-incby el ejemplo de polímero para agregar un campo de data-incby que toma el valor incrementa el conteo de esta manera:

<polymer-element name="x-click-counter"> <template> <button on-click="increment" data-incby="2"> <!-- now passing the value as a data attribute --> Click Me </button> </template> </polymer-element> <script> import ''package:polymer/polymer.dart''; @CustomTag("x-click-counter") class CounterComponent extends PolymerElement with ObservableMixin { @observable int count = 0; void increment(Event event, var detail, var target) { int incBy = int.parse(target.attributes[''data-incby'']); // extract the value 2 count = count + incBy; } } </script>