Las propiedades definidas como del tipo de datos Number
se convierten al tipo de datos String
debido a la entrada del usuario. Me pregunto si este síntoma no le ocurre solo a iron-input
o paper-input
, sino que este es el comportamiento de Polymer. ¿Existe una forma sencilla de detener la conversión del tipo de datos?
Ingrese cualquier número entre los siguientes iron-input
. "cadena" siempre aparecerá.
index.html:
<!DOCTYPE html>
<html>
<head>
<script src="bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
<link rel="import" href="proto.html">
</head>
<body>
<proto-element></proto-element>
</body>
</html>
proto.html:
<link rel="import" href="bower_components/polymer/polymer.html">
<link rel="import" href="bower_components/iron-input/iron-input.html">
<dom-module id="proto-element">
<template>
<input is="iron-input" bind-value="{{value}}">
</template>
</dom-module>
<script>
Polymer({
is: "proto-element",
properties:{
value:{
type:Number,
value:1,
observer:"valueChanged"
}
},
valueChanged:function(n,o){
if(typeof o != "undefined")
alert(typeof n);
}
});
</script>
Este no es el comportamiento de Polymer, es el comportamiento estándar de DOM. La propiedad input
etiqueta value
es un valor de cadena:
https://developer.mozilla.org/en/docs/Web/API/HTMLInputElement
Los type: Number
en la propiedad no afectan esto; ese valor solo se usa al deserializarun valor de atributo del marcado . Entonces, si tiene un marcado como este:
<my-element value="123">
Estás configurando la propiedad value
con la cadena "123". Si value
es type: Number
,
se deserializará como el número 123.
Por otro lado, esto:
<my-element value="{{hostValue}}">
Vincula la propiedad hostValue
los hosts a la propiedad my-element
de value
. Aquí no se involucra ninguna conversión de tipo; tienen el mismo valor.
Por lo tanto, deberá convertir el valor de la cadena de entrada a otra cosa. input Proporciona una propiedad valueAsNumber
, que podría enlazar así:
<input is="iron-input" type="number" value-as-number="{{value::input}}">
Alternativamente, puede forzar el valor en su método valueChanged
:
valueChanged:function(n) {
if(typeof n == "string") {
this.value = Number(n);
}
}
@arthurevans ¡ Muchas gracias por la explicación detallada!
Quizás agregarlo a las preguntas frecuentes de Polymer también ayude a otros usuarios.
Si usa accesorios, escriba arrayObject. puedes resolverlo así.
https://github.com/pongpanot-t/lab-polymer/blob/master/data-binding/bind-prop-number.html
Comentario más útil
Este no es el comportamiento de Polymer, es el comportamiento estándar de DOM. La propiedad
input
etiquetavalue
es un valor de cadena:Los
type: Number
en la propiedad no afectan esto; ese valor solo se usa al deserializarun valor de atributo del marcado . Entonces, si tiene un marcado como este:Estás configurando la propiedad
value
con la cadena "123". Sivalue
estype: Number
,se deserializará como el número 123.
Por otro lado, esto:
Vincula la propiedad
hostValue
los hosts a la propiedadmy-element
devalue
. Aquí no se involucra ninguna conversión de tipo; tienen el mismo valor.Por lo tanto, deberá convertir el valor de la cadena de entrada a otra cosa. input Proporciona una propiedad
valueAsNumber
, que podría enlazar así:Alternativamente, puede forzar el valor en su método
valueChanged
: