角度给定错误"模型不是“数字”类型"当typeof === number

时间:2015-03-30 00:02:32

标签: javascript angularjs

作为一种无法在没有指令的情况下过滤输入的工作,我尝试了以下方法:

在输入ngChange上检测到更改并运行一个函数。输入有type="number"

<input type="number"
       ng-model="ctrl.met.mass"
       ng-change="ctrl.met.update.mass()">

该函数更新其他一些字段,然后格式化它们。在这个例子中,我希望它用toFixed(2)显示两个小数点。这是通过variable = variable.toFixed(2)

完成的
ctrl.met.cost = ctrl.met.mass * ctrl.met.price;
ctrl.imp.mass = ctrl.met.mass * 0.0353;
ctrl.imp.cost = ctrl.imp.mass * ctrl.imp.price;

console.log(typeof ctrl.met.mass); // number

ctrl.met.mass = ctrl.met.mass.toFixed(2);
console.log(typeof ctrl.met.mass); //string

但是这个号码并没有格式化,因为我收到了this error;请注意,URL末尾的数字是29.00,是所需的结果。如果数字是12.34,那就是29.00。

Error: ngModel:numfmt
Model is not of type `number`

但是当我在任何一点运行typeof ctrl.met.mass,或者我正在使用的任何其他变量时,它告诉我它实际上是一个数字,除非.toFixed()与它进行了交互。

Angular Number Filter(注入后),parseInt()parseFloat()toPrecision()发生了同样的错误(精度为4,以确保两位小数两位数的数字)。

ctrl.met.mass = $filter("number")(ctrl.met.mass, 2);
ctrl.met.mass = $filter("number")(parseInt/Float/Precision(ctrl.met.mass), 2);
ctrl.met.mass = ctrl.met.mass.toInt/Float
ctrl.met.mass = ctrl.met.mass.Precision(4);

我想我将无法这样做,并且需要使用指令。在我尝试之前,为什么会发生这种情况并且可以解决它?

编辑:看来我正在尝试的是不可能的。在将ctrl.met.mass设置为毫无疑问的是具有两个小数位的数字时,它优先于整数拒绝它。如果有人知道为什么会这样,请分享。

2 个答案:

答案 0 :(得分:1)

toFixed方法返回的值是一个字符串。因此,您需要将其转换为控制器中的float:

var fixed = ctrl.met.mass.toFixed(2);
ctrl.met.mass = parseFloat(fixed);

答案 1 :(得分:0)

你可以创建一个stringToNumber指令来解析字符串到数字,这个完美的例子显示在下面的链接: https://docs.angularjs.org/error/ngModel/numfmt