我在打字稿中上课。它有一些字段
field1 : ko.observable<number>();
field2 : ko.observable<string>('');
...
在另一个类的某个函数中,我试图遍历每个对象字段,对于number
类型的字段,我需要执行一些修改。
我怎样才能发现这个?
我接下来尝试了,但总是输入string
这是逻辑上的。 locationModel
已填满
使用HTML表单中的值,其中输入的类型为text
Object.keys(locationModel)
.forEach(property => {
if (typeof locationModel[property]() === 'number') { }
else{ }
}
});
答案 0 :(得分:1)
如果你想将自动类型转换放入淘汰赛,你可以为此创建一个扩展器。
在最基本的形式中,它可以返回writable computed:
后者的实现可能是这样的 - 运行下面的代码片段并注意该类型在viewmodel中的反映方式:
ko.extenders.type = function (target, type) {
var typedValue = ko.pureComputed({
read: function () {
var value = target();
if (typeof value === "undefined" || value === null) {
return value;
} else {
return type(value);
}
},
write: target
});
typedValue.raw = target;
return typedValue;
};
var vm = {
num: ko.observable().extend({type: Number}),
str: ko.observable().extend({type: String})
};
ko.applyBindings(vm);
// init some values
vm.num(100);
vm.str(100);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
Num: <input data-bind="value: num"> (raw: <span data-bind="text: num.raw"></span>)<br>
Str: <input data-bind="value: str"> (raw: <span data-bind="text: str.raw"></span>)<br><br>
<hr>
View Model:<br>
<pre data-bind="text: ko.toJSON($root, null, 2)"></pre>
答案 1 :(得分:0)
您的问题是表单中的输入值始终是字符串,您必须正确解析值以使其成为您想要的类型。
因此,您需要手动设置一些映射,以便将所有输入字符串转换为模型中的相应值。