由于用户输入,定义为Number
数据类型的属性将转换为String
数据类型。 我想知道这种症状不仅发生在iron-input
或paper-input
,而且这是 Polymer 的行为。 有没有简单的方法来停止数据类型转换?
请在以下iron-input
输入任意数字。 “字符串”将始终弹出。
索引.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>
这不是 Polymer 的行为,而是标准的 DOM 行为。 input
标签的value
属性是一个字符串值:
https://developer.mozilla.org/en/docs/Web/API/HTMLInputElement
属性上的type: Number
不影响此; 该值仅在反序列化时使用来自标记的属性值。 所以,如果你有这样的标记:
<my-element value="123">
您正在使用字符串“123”配置value
属性。 如果value
是type: Number
,
它将被反序列化为数字 123。
另一方面,这:
<my-element value="{{hostValue}}">
将主机的hostValue
属性绑定到my-element
的value
属性。 这里不涉及类型转换; 它们具有相同的值。
因此,您需要将输入的字符串值转换为其他值。 input 提供一个valueAsNumber
属性,您可以像这样绑定它:
<input is="iron-input" type="number" value-as-number="{{value::input}}">
或者,您可以在valueChanged
方法中强制使用该值:
valueChanged:function(n) {
if(typeof n == "string") {
this.value = Number(n);
}
}
@arthurevans 非常感谢您的详细解释!
也许将其添加到 Polymer 的常见问题解答中也会对其他用户有所帮助。
如果使用 props 类型 arrayObject。 你可以这样解决。
https://github.com/pongpanot-t/lab-polymer/blob/master/data-binding/bind-prop-number.html
最有用的评论
这不是 Polymer 的行为,而是标准的 DOM 行为。
input
标签的value
属性是一个字符串值:属性上的
type: Number
不影响此; 该值仅在反序列化时使用来自标记的属性值。 所以,如果你有这样的标记:您正在使用字符串“123”配置
value
属性。 如果value
是type: Number
,它将被反序列化为数字 123。
另一方面,这:
将主机的
hostValue
属性绑定到my-element
的value
属性。 这里不涉及类型转换; 它们具有相同的值。因此,您需要将输入的字符串值转换为其他值。 input 提供一个
valueAsNumber
属性,您可以像这样绑定它:或者,您可以在
valueChanged
方法中强制使用该值: