Polymer: Modèle : le type de données numérique est converti en chaîne en raison de la saisie de l'utilisateur

Créé le 1 juil. 2015  ·  3Commentaires  ·  Source: Polymer/polymer

Les propriétés définies à partir du type de données Number sont converties en type de données String raison de la saisie de l'utilisateur. Je me demande ce symptôme n'arrive pas seulement à iron-input ou paper-input , mais c'est le comportement de Polymer. Existe-t-il un moyen simple d'arrêter la conversion de type de données ?

Veuillez entrer n'importe quel nombre dans le iron-input . "string" apparaîtra toujours.

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>
question

Commentaire le plus utile

Ce n'est pas le comportement de Polymer, c'est le comportement standard du DOM. La propriété input balise value est une valeur de chaîne :

https://developer.mozilla.org/en/docs/Web/API/HTMLInputElement

Le type: Number sur la propriété n'affecte pas cela ; cette valeur n'est utilisée que lors de la désérialisationune valeur d'attribut du balisage . Donc, si vous avez un balisage comme celui-ci :

 <my-element value="123">

Vous configurez la propriété value avec la chaîne "123". Si value est type: Number ,
il sera désérialisé sous le numéro 123.

D'autre part, ceci :

<my-element value="{{hostValue}}">

Lie la propriété hostValue l'hôte à la propriété my-element de value . Aucune conversion de type n'est impliquée ici ; ils ont la même valeur.

Vous devrez donc convertir la valeur de chaîne de l'entrée en quelque chose d'autre. input Fournit une propriété valueAsNumber , que vous pouvez lier comme ceci :

    <input is="iron-input"  type="number" value-as-number="{{value::input}}">

Alternativement, vous pouvez forcer la valeur dans votre méthode valueChanged :

    valueChanged:function(n) {
        if(typeof n == "string") {
          this.value = Number(n);
        }
    }

Tous les 3 commentaires

Ce n'est pas le comportement de Polymer, c'est le comportement standard du DOM. La propriété input balise value est une valeur de chaîne :

https://developer.mozilla.org/en/docs/Web/API/HTMLInputElement

Le type: Number sur la propriété n'affecte pas cela ; cette valeur n'est utilisée que lors de la désérialisationune valeur d'attribut du balisage . Donc, si vous avez un balisage comme celui-ci :

 <my-element value="123">

Vous configurez la propriété value avec la chaîne "123". Si value est type: Number ,
il sera désérialisé sous le numéro 123.

D'autre part, ceci :

<my-element value="{{hostValue}}">

Lie la propriété hostValue l'hôte à la propriété my-element de value . Aucune conversion de type n'est impliquée ici ; ils ont la même valeur.

Vous devrez donc convertir la valeur de chaîne de l'entrée en quelque chose d'autre. input Fournit une propriété valueAsNumber , que vous pouvez lier comme ceci :

    <input is="iron-input"  type="number" value-as-number="{{value::input}}">

Alternativement, vous pouvez forcer la valeur dans votre méthode valueChanged :

    valueChanged:function(n) {
        if(typeof n == "string") {
          this.value = Number(n);
        }
    }

@arthurevans Merci beaucoup pour l'explication détaillée !
Peut-être que l'ajouter à la FAQ de Polymer aidera également d'autres utilisateurs.

Si vous utilisez des accessoires, tapez arrayObject. vous pouvez restaurer comme ceci.
https://github.com/pongpanot-t/lab-polymer/blob/master/data-binding/bind-prop-number.html

Cette page vous a été utile?
0 / 5 - 0 notes